使用嵌套循环创建数据框

时间:2017-05-16 17:25:12

标签: python loops pandas dataframe

我是熊猫新手,请原谅我,如果这是一个简单的问题。我想通过使用来自两个不同数据帧的元素来创建数据帧。 做这个的最好方式是什么?看起来我将不得不使用某种嵌套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

4 个答案:

答案 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'仅保留vegadf1中出现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']


更新:对您的编辑3的响应

是的,你可以做你想做的事。试试看吧。将两个数据框合并在一起时,df1中的不匹配列将变为colname_xdf2中的不匹配列将变为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