我有一个以下结构的数据框。我希望在比较两行时得到具有相同值(对于特定值)的列号。
1 1 0 1 1
0 1 0 1 0
0 1 0 0 1
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
因此,例如当我使用上面的示例df来比较两行来获取其中包含1的列时,我应该在比较row(0)和row(1)时得到col(1)和col(3) )。类似地,当我比较row(1)和row(2)时,我应该得到col(1)。我想知道python中是否有更高效的解决方案。
注意:我只想要匹配的列号,我还要指定要比较的行。
答案 0 :(得分:3)
考虑以下数据框:
import numpy as np
df = pd.DataFrame(np.random.binomial(1, 0.2, (2, 10000)))
它将是一个大小为2x10000的二进制矩阵。
np.where((df.iloc[0] * df.iloc[1]))
或者,
np.where((df.iloc[0]) & (df.iloc[1]))
返回两行中包含1的列。乘法似乎更快:
%timeit np.where((df.iloc[0]) & (df.iloc[1]))
1000 loops, best of 3: 400 µs per loop
%timeit np.where((df.iloc[0] * df.iloc[1]))
1000 loops, best of 3: 269 µs per loop
答案 1 :(得分:0)
这是一个简单的功能。您可以根据需要进行修改,具体取决于您表示数据的方式。我假设一份清单:
df = [[1,1,0,1,1],
[0,1,0,1,0],
[0,1,0,0,1],
[1,0,0,0,1],
[0,0,0,0,0],
[1,0,0,0,1]]
def compare_rows(df,row1,row2):
"""Returns the column numbers in which both rows contain 1's"""
column_numbers = []
for i,_ in enumerate(df[0]):
if (df[row1][i] == 1) and (df[row2][i] ==1):
column_numbers.append(i)
return column_numbers
compare_rows(df,0,1)
生成输出:
[1,3]