【问题标题】:Python Pandas working with dataframes in functionsPython Pandas 在函数中使用数据框
【发布时间】:2014-01-01 05:35:00
【问题描述】:

我有一个 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

这对我来说感觉有点笨拙,但如果不复制数据框,我想不出更好的方法来做到这一点。有什么建议吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果您不想在原始 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']),以进行分组,而不仅仅是列名。

    【讨论】:

    • 不错的解决方案,我没有意识到你可以这样使用groupby
    • 是的,有一个名副其实的plethora of objects可以用来指定groupby。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2021-07-12
    • 2021-12-29
    相关资源
    最近更新 更多