IDはパンダデータフレームに新しい列をリストで見つけ追加

MDR:

私は、次のデータフレーム(整数の列と整数のリストで列を)持っていると言います...

      ID                   Found_IDs
0  12345        [15443, 15533, 3433]
1  15533  [2234, 16608, 12002, 7654]
2   6789      [43322, 876544, 36789]

そしてまた、IDの別のリスト...

bad_ids = [15533, 876544, 36789, 11111]

それを考えると、無視df['ID']列と任意のインデックスを、私は内のIDのいずれかどうかを確認したいbad_idsリストがに記載されているdf['Found_IDs']列。私がこれまで持っているコードは次のとおりです。

df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]

この作品だけならばbad_ids、リストは、データフレームよりも、実際のデータセットの長いbad_idsリストがデータフレームよりたくさん短いことになるだろう。私は設定されている場合bad_idsのみ二つの要素にリストを...

bad_ids = [15533, 876544]

私は非常に人気のあるエラー(私は同じエラーを持つ多くの質問を読んでいる)を取得します...

ValueError: Length of values does not match length of index

私はシリーズ(エラーでは変更なし)にリストを変換しようとしています。私はまた、新しい列を追加するとするすべての値を設定しようとしたFalse理解ライン(エラーで再び変更なし)を行う前に。

二つの質問:

  1. どのように私は、データフレームよりも短いリストは仕事に(下)私のコードを得るのですか?
  2. どのように私はコードが実際のIDを書き込むようになるだろう背中に見つかったdf['bad_id'](真/偽よりも有用)の列?

予想出力bad_ids = [15533, 876544]

      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]    True
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]    True

以下のための理想的な出力bad_ids = [15533, 876544](ID(複数可)は、新しい列または列に書き込まれます):

      ID                   Found_IDs  bad_id
0  12345        [15443, 15533, 3433]    15533
1  15533  [2234, 16608, 12002, 7654]   False
2   6789      [43322, 876544, 36789]    876544

コード:

import pandas as pd

result_list = [[12345,[15443,15533,3433]],
        [15533,[2234,16608,12002,7654]],
        [6789,[43322,876544,36789]]]

df = pd.DataFrame(result_list,columns=['ID','Found_IDs'])

# works if list has four elements
# bad_ids = [15533, 876544, 36789, 11111]

# fails if list has two elements (less elements than the dataframe)
# ValueError: Length of values does not match length of index
bad_ids = [15533, 876544]

# coverting to Series doesn't change things
# bad_ids = pd.Series(bad_ids)
# print(type(bad_ids))

# setting up a new column of false values doesn't change things
# df['bad_id'] = False

print(df)

df['bad_id'] = [c in l for c, l in zip(bad_ids, df['Found_IDs'])]

print(bad_ids)

print(df)
Arfan:

使用してnp.intersect1d二つのリストの交差を取得するには:

df['bad_id'] = df['Found_IDs'].apply(lambda x: np.intersect1d(x, bad_ids))

      ID                   Found_IDs    bad_id
0  12345        [15443, 15533, 3433]   [15533]
1  15533  [2234, 16608, 12002, 7654]        []
2   6789      [43322, 876544, 36789]  [876544]

またはの交差を使用してちょうどバニラのpythonとsets

bad_ids_set = set(bad_ids)
df['Found_IDs'].apply(lambda x: list(set(x) & bad_ids_set))

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=394982&siteId=1