从两个数据帧中提取数据以创建第三个数据帧

时间:2016-03-23 21:55:36

标签: python dataframe

我正在使用Python Pandas以下内容。我有三个数据框,df1df2df3。每个都有相同的尺寸,索引和列标签。我想创建第四个数据框,根据df1中的值取自df2df3的元素:

df1 = pd.DataFrame(np.random.randn(4, 2), index=list('0123'), columns=['A', 'B'])

df1

Out[67]: 
      A         B
0  1.335314  1.888983
1  1.000579 -0.300271
2 -0.280658  0.448829
3  0.977791  0.804459

df2 = pd.DataFrame(np.random.randn(4, 2), index=list('0123'), columns=['A', 'B'])
df2
Out[68]: 
      A         B
0  0.689721  0.871065
1  0.699274 -1.061822
2  0.634909  1.044284
3  0.166307 -0.699048

df3 = pd.DataFrame({'A': [1, 0, 0, 1], 'B': [1, 0, 1, 0]})
df3
Out[69]: 
   A  B
0  1  1
1  0  0
2  0  1
3  1  0

如果df4中的相应值为df1,则新数据框df3具有相同的索引和列标签,并从1获取元素。如果df2中的相应值为df3,则需要0的元素。

我需要一个使用通用引用的解决方案(例如ixiloc),而不是实际的列标签和索引值,因为我的数据集有50列和400行。

2 个答案:

答案 0 :(得分:1)

df4 = df1.where(df3.astype(bool), df2)应该这样做。

import pandas as pd
import numpy  as np

df1 = pd.DataFrame(np.random.randint(10, size = (4,2)))
df2 = pd.DataFrame(np.random.randint(10, size = (4,2)))
df3 = pd.DataFrame(np.random.randint(2, size = (4,2)))
df4 = df1.where(df3.astype(bool), df2)

print df1, '\n'
print df2, '\n'
print df3, '\n'
print df4, '\n'

输出:

   0  1
0  0  3
1  8  8
2  7  4
3  1  2 

   0  1
0  7  9
1  4  4
2  0  5
3  7  2 

   0  1
0  0  0
1  1  0
2  1  1
3  1  0 

   0  1
0  7  9
1  8  4
2  7  4
3  1  2 

答案 1 :(得分:1)

由于您的DataFrame恰好是数字,而选择器矩阵恰好是指标变量,您可以执行以下操作:

>>> pd.DataFrame(
    df1.as_matrix() * df3.as_matrix() + df1.as_matrix() * (1 - df3.as_matrix()),
    index=df1.index,
    columns=df1.columns)

我试过了,它有效。奇怪的是,@ Yakym Pirozhenko的答案 - 我认为是优越的 - 对我来说也不起作用。