我是熊猫新手,请原谅我,如果这是一个简单的问题。我想通过使用来自两个不同数据帧的元素来创建数据帧。 做这个的最好方式是什么?看起来我将不得不使用某种嵌套for循环:
for a in df1.itertuples()
for b in df2.itertuples()
if df1.vega(a) = df2.vega(b)
delta = df2.gamma(a) – df1.gamma(b)
if delta > 0 or delta <0
zelda = df2.blabla(b)
编辑: 两个数据帧都具有相同的列名称:
df1 = pd.DataFrame({'vega': [bla1, bla2, bla3, bla4], 'gamma': [242340.1, 466530.2, 325346, 34654365]})
df2 = pd.DataFrame({'vega': [bla6, bla2, bla7, bla4], 'gamma': [3454334, 896530.2, 32543, 34654]})
EDIT2: 在此示例中,新数据框将为:
zelda|
----- |
430000 |
-34619711 |
EDIT3: 对不起,伙计们,你的回答让我眼前一亮,让我重新思考我的问题,因为这里似乎根本不需要循环。我在我的数据框中添加了一个“排名”列,对df2中的“vega”列进行了混洗,并将“rho”列添加到结果数据框中。 (实际上我在数据框中有更多列,但它们的使用方式与“gamma”,“blabla”或“排名”列相同。)
使用你们提出的合并解决方案仍然可以吗?我再次对第一个不完整的问题道歉。
zelda = df2.blabla(b)
rho = df1.ranking(a)
df1 = pd.DataFrame({'vega': [bla1, bla2, bla3, bla4], 'gamma': [242340.1, 466530.2, 325346, 34654365, ‘blabla’: [regina, cactus, galileo, viking], ‘ranking’: [11, 34,65,46]]})
df2 = pd.DataFrame({'vega': [bla2, bla6, bla7, bla4], 'gamma': [3454334, 896530.2, 32543, 34654], ‘blabla’: [lucy, fletnix, ingrid, pablo], ‘ranking’: [45, 4,5,3]})
在这个新示例中,新数据框将是:
delta| zelda| rho|vega
---------|-------|----|----
2987803,8|fletnix| 34|bla2
-34619711| pablo| 46|bla4
答案 0 :(得分:2)
IIUC:
In [56]: df1.merge(df2, on='vega', suffixes=['1','2']) \
...: .eval("zelda = gamma2 - gamma1", inplace=False)[['zelda']]
...:
Out[56]:
zelda
0 430000.0
1 -34619711.0
答案 1 :(得分:1)
这是你在找什么?
mask = df1.vega == df2.vega
delta = df1[mask].gamma - df2[mask].gamma
delta[delta != 0]
1 -430000.0
3 34619711.0
Name: gamma, dtype: float64
答案 2 :(得分:1)
或者您可以使用set_index
并使用Pandas的内部索引对齐特性来减去数据帧。
df1.set_index('vega')
df2.set_index('vega')
(df2 - df1).dropna().rename(columns={'gamma':'zelda'})
输出:
zelda
vega
bla2 430000.0
bla4 -34619711.0
答案 3 :(得分:0)
另一个选项是,在vega
列上创建一个数据框merged,并为其添加新数据列。在合并调用中设置how='inner'
仅保留vega
和df1
中出现df2
值的行。
joint = df1.merge(df2, on='vega', how='inner')
gamma_x vega gamma_y
0 466530.2 bla2 896530.2
1 34654365.0 bla4 34654.0
然后,pandas可以让您轻松地从一列中减去另一列中的值:
joint['delta'] = joint['gamma_y'] - joint['gamma_x']
gamma_x vega gamma_y delta
0 466530.2 bla2 896530.2 430000.0
1 34654365.0 bla4 34654.0 -34619711.0
您可以选择符合条件的行:
zelda = joint[(joint['delta'] > 0) | (joint['delta'] < 0)]['delta']
是的,你可以做你想做的事。试试看吧。将两个数据框合并在一起时,df1
中的不匹配列将变为colname_x
,df2
中的不匹配列将变为colname_y
。因此,您可以根据需要选择所需的列。
joint = df1.merge(df2, on='vega', how='inner')
joint['delta'] = joint['gamma_y'] - joint['gamma_x']
joint['rho'] = joint['ranking_x'] # select the ranking column from df1
joint['zelda'] = joint['blabla_y'] # select the blabla column from df2
joint[['delta', 'zelda', 'rho', 'vega']] # select only the columns from your example output
delta zelda rho vega
0 2987803.8 lucy 34 bla2
1 -34619711.0 pablo 46 bla4