根据另一个数据帧中的值计算数据框中的值

时间:2018-03-26 21:00:05

标签: python pandas dataframe

我很感激任何人都可以提供任何帮助,因为一直在试图解决它。

我有两个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 |
+-----+-----+-----+----------------------+

有人能帮忙吗?!提前谢谢。

3 个答案:

答案 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