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

3

我对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 中的最后一个值上,使得这个值成为第二组的值。

    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

我对第二组执行了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

数据框将由数百行组成。我一直在尝试各种groupby、apply组合,但我完全被卡住了。
谢谢。
2个回答

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

尝试使用简短版本 :) - zipa
那似乎可以工作。我只需要将第三行更改为df.loc[df['B']==i, 'C'] = df['D'].sum() + 500谢谢! - BruceWee

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接