我有一个列表,其中包含两个元素的列表。
我想将数据帧筛选为列表列表中[column_a, column_b]
所在的行。
例:
输入:
l = [ [0,1], [1,2] ]
df = pd.DataFrame({'column_a' : [0, 1, 2], 'column_b' : [1, 3, 0]})
column_a column_b
0 0 1
1 1 3
2 2 0
预期产出:
column_a column_b
0 0 1
从列表中创建一个 df 并合并:
df.merge(pd.DataFrame(l,columns=df.columns))
column_a column_b
0 0 1
循环的某些时间一点也不差
df[[x in l for x in df.values.tolist()]]
Out[135]:
column_a column_b
0 0 1
我的解决方案
l = [[0, 1], [1, 2]]
df = pd.DataFrame({'column_a': [0, 1, 2], 'column_b': [1, 3, 0]})
for elem in l:
df.loc[(df['column_a'] == elem[0]) & (df['column_b'] == elem[1]), 'Result'] = 1
df = df[df['Result'] == 1].drop(['Result'], axis=1)
输出:
column_a column_b
0 0 1
你可以做:
l = [ [0,1], [1,2] ]
l=[tuple(el) for el in l]
#it has to be in tuple format
df.loc[df[['column_a', 'column_b']].apply(tuple, axis=1).isin(l)]
输出:
column_a column_b
0 0 1
找到了一种通过添加列来做到这一点的方法。也许不是最简单的方法,但它有效:
df['c'] = [[x, y] for x, y in zip(df['column_a'], df['column_b'])]
df[[x in l for x in df['c']]]
输出:
column_a column_b c
0 0 1 [0, 1]