我有一个DataFrame,我想传递给一个函数,从中获取一些信息,然后返回该信息。最初我设置了我的代码:
df = pd.DataFrame( {
'A': [1,1,1,1,2,2,2,3,3,4,4,4],
'B': [5,5,6,7,5,6,6,7,7,6,7,7],
'C': [1,1,1,1,1,1,1,1,1,1,1,1]
} );
def test_function(df):
df['D'] = 0
df.D = np.random.rand(len(df))
grouped = df.groupby('A')
df = grouped.first()
df = df['D']
return df
Ds = test_function(df)
print(df)
print(Ds)
返回:
A B C D
0 1 5 1 0.582319
1 1 5 1 0.269779
2 1 6 1 0.421593
3 1 7 1 0.797121
4 2 5 1 0.366410
5 2 6 1 0.486445
6 2 6 1 0.001217
7 3 7 1 0.262586
8 3 7 1 0.146543
9 4 6 1 0.985894
10 4 7 1 0.312070
11 4 7 1 0.498103
A
1 0.582319
2 0.366410
3 0.262586
4 0.985894
Name: D, dtype: float64
我的想法是,我不想复制我的大型数据框,因此我将为其添加一个工作列,然后只返回我想要的信息而不影响原始数据帧。这当然不起作用,因为我没有复制数据框,所以添加一列就是添加一列。目前我正在做类似的事情:
add column
results = Derive information
delete column
return results
对我来说感觉有点笨拙,但我想不出更好的方法来做到这一点而不复制数据帧。有什么建议吗?
答案 0 :(得分:2)
如果您不想在原始DataFrame中添加列,则可以创建独立的Series
并将groupby
方法应用于Series
:
def test_function(df):
ser = pd.Series(np.random.rand(len(df)))
grouped = ser.groupby(df['A'])
return grouped.first()
Ds = test_function(df)
产量
A
1 0.017537
2 0.392849
3 0.451406
4 0.234016
dtype: float64
因此,test_function
根本不会修改df
。请注意,ser.groupby
可以传递一组值(例如df['A']
)来进行分组,而不仅仅是列的名称。