Pandas,在迭代分组数据中的行时使用生成的值

时间:2017-04-21 11:02:01

标签: python pandas

我对Pandas和一般的编程都很陌生,但我一直都能通过谷歌找到任何问题的答案,直到现在。对于这个描述性不强的问题感到抱歉,希望有人可以提出更明确的问题。

我正在尝试将数据分组在一起,对该数据执行功能,更新列,然后在下一组数据中使用该列中的数据。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.random(9),columns=['A'])
df['B'] = [1,1,1,2,2,3,3,3,3]
df['C'] = np.nan
df['D'] = np.nan
df.loc[0:2,'C'] = 500

给我

    A           B   C       D
0   0.825828    1   500.0   NaN
1   0.218618    1   500.0   NaN
2   0.902476    1   500.0   NaN
3   0.452525    2   NaN     NaN
4   0.513505    2   NaN     NaN
5   0.089975    3   NaN     NaN
6   0.282479    3   NaN     NaN
7   0.774286    3   NaN     NaN
8   0.408501    3   NaN     NaN

C列中的500是初始条件。我想按B列对数据进行分组,并在第一组

上执行以下功能
def function1(row):
    return row['A']*row['C']/6

给我

    A           B   C       D
0   0.825828    1   500.0   68.818971
1   0.218618    1   500.0   18.218145
2   0.902476    1   500.0   75.206313
3   0.452525    2   NaN     NaN
4   0.513505    2   NaN     NaN
5   0.089975    3   NaN     NaN
6   0.282479    3   NaN     NaN
7   0.774286    3   NaN     NaN
8   0.408501    3   NaN     NaN

然后,我想要将D中的前三个值相加,并将它们添加到C中的最后一个值,并将此值设为第2组值

    A           B   C           D
0   0.825828    1   500.000000  68.818971
1   0.218618    1   500.000000  18.218145
2   0.902476    1   500.000000  75.206313
3   0.452525    2   662.243429  NaN
4   0.513505    2   662.243429  NaN
5   0.089975    3   NaN         NaN
6   0.282479    3   NaN         NaN
7   0.774286    3   NaN         NaN
8   0.408501    3   NaN         NaN

然后我在第2组上执行function1并重复,直到我最终得到这个

    A           B   C           D
0   0.825828    1   500.000000  68.818971
1   0.218618    1   500.000000  18.218145
2   0.902476    1   500.000000  75.206313
3   0.452525    2   662.243429  49.946896
4   0.513505    2   662.243429  56.677505
5   0.089975    3   768.867830  11.529874
6   0.282479    3   768.867830  36.198113
7   0.774286    3   768.867830  99.220591
8   0.408501    3   768.867830  52.347246

数据框将包含数百行。我一直在尝试各种组合,应用组合,但我完全被难倒了。

由于

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

df['D'] = df['A'] * df['C']/6

for i in df['B'].unique()[1:]:
    df.loc[df['B']==i, 'C'] = df['D'].sum()
    df.loc[df['B']==i, 'D'] = df['A'] * df['C']/6

答案 1 :(得分:0)

您可以使用numpy.unique()作为选择。在你的代码中,这可能看起来像这样:

import numpy as np
import math

unique, indices, counts = np.unique(df['B'], return_index=True, return_counts=True)

for i in range(len(indices)):
    for j in range(len(counts)):
        row = df[indices[i]+j]
        if math.isnan(row['C']):
            row['C'] = df.loc[indices[i-1], 'D']  
        # then call your function
        function1(row)