我正在使用Python Pandas以下内容。我有三个数据框,df1
,df2
和df3
。每个都有相同的尺寸,索引和列标签。我想创建第四个数据框,根据df1
中的值取自df2
或df3
的元素:
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
的元素。
我需要一个使用通用引用的解决方案(例如ix
或iloc
),而不是实际的列标签和索引值,因为我的数据集有50列和400行。
答案 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的答案 - 我认为是优越的 - 对我来说也不起作用。