我很感激任何人都可以提供任何帮助,因为一直在试图解决它。
我有两个python pandas数据帧,简化形式如下:
DF1
+-----+-----+-----+
| a_1 | a_2 | a_3 |
+-----+-----+-----+
| 0 | 2 | 5 |
| 1 | 3 | 4 |
| 0 | 0 | 0 |
+-----+-----+-----+
DF2
+-----+-----+-----+
| b_1 | b_2 | b_3 |
+-----+-----+-----+
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 0 | 0 |
+-----+-----+-----+
如果df2中的等效单元格为非null,我想在df1中创建一个非空值的计数列(每行)。两个数据框中的列标题不同,但在初始a_和b_前缀后相同。
因此,在此示例中,代码将仅计算第一行中的第三个值,以及第二行中的第一个和第二个值。因此,新的df1数据框将如下所示:
new_df1
+-----+-----+-----+----------------------+
| a_1 | a_2 | a_3 | count_if_nonnull_df2 |
+-----+-----+-----+----------------------+
| 0 | 2 | 5 | 1 |
| 1 | 3 | 4 | 2 |
| 0 | 0 | 0 | 0 |
+-----+-----+-----+----------------------+
有人能帮忙吗?!提前谢谢。
答案 0 :(得分:1)
假设"非null"你的意思是"非零" (根据你的例子),试试这个......
问题设置:
>>> df1 = pd.DataFrame.from_dict({'a_1':[0,1,0], 'a_2':[2,3,0], 'a_3':[5,4,0]})
>>> df2 = pd.DataFrame.from_dict({'b_1':[0,1,0], 'b_2':[0,0,0], 'b_3':[1,1,0]})
使用我们强制转换的掩码,我们可以计算行的总和:
>>> df1['count_if_nonnull_df2'] = (df2 > 0).astype(int).sum(axis=1)
>>> df1
a_1 a_2 a_3 count_if_nonnull_df2
0 0 2 5 1
1 1 3 4 2
2 0 0 0 0
答案 1 :(得分:0)
好吧,如果a_ df和b_ df是矩阵,你可以在元素上将两者相乘。请注意,这假设每个df的列的顺序正确(如果没有,则很容易完成)。对于您的示例,这将产生类似
的矩阵0 0 5
1 0 4
0 0 0
然后,您可以计算每行中有多少非零值。
您可以使用df.as_matrix()将每个数据帧转换为numpy数组,将两者简单地与result = first_mtx * second_mtx相乘,然后将count_nonzer与axis = 1相乘。
first_array = a_df.as_matrix()
second_array = b_df.as_matrix()
count_if_nonnull_df2 = np.count_nonzero(first_array*second_array,axis=1)
答案 2 :(得分:0)
我认为可以
df1['countif']=np.sum((df1.ne(0).values)&(df2.ne(0).values),1)
df1
Out[703]:
a_1 a_2 a_3 countif
0 0 2 5 1
1 1 3 4 2
2 0 0 0 0