首页 > 解决方案 > 如何从 groupby() 生成的组中删除列?

问题描述

我在尝试理解 python 中的分组时遇到了一些麻烦,特别是使用 groupby() 函数。我有一个数据框,然后我按特定列中的名称对该数据框进行分组,然后我看到为每个名称生成了三个新的数据框。问题是,我无法弄清楚如何实际使用这些生成的新数据帧。这是我所拥有的...

我产生了这个数据框:

df = pd.DataFrame({"Name": ["Bob", "Bob", "Bob", "Jack", "Jack", "Jack", "Joe", "Joe", "Joe"], "Value": [4, 2, 5, 6, 9, 4, 3, 4, 2], "timestamp": ["2020-10-01 09:00", "2020-10-02 09:00", "2020-10-05 09:00", "2020-10-06 09:00", "2020-10-07 09:00", "2020-10-08 09:00", "2020-10-04 09:00", "2020-10-05 09:00", "2020-10-06 09:00"], "location": ["New York", "New York", "New York", "London", "London", "London", "Paris", "Paris", "Paris"]})
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d %H:%M")
df

这显示:

   Name     Value               timestamp     location
0   Bob         4     2020-10-01 09:00:00     New York
1   Bob         2     2020-10-02 09:00:00     New York
2   Bob         5     2020-10-05 09:00:00     New York
3   Jack        6     2020-10-06 09:00:00       London
4   Jack        9     2020-10-07 09:00:00       London
5   Jack        4     2020-10-08 09:00:00       London
6   Joe         3     2020-10-04 09:00:00        Paris
7   Joe         4     2020-10-05 09:00:00        Paris
8   Joe         2     2020-10-06 09:00:00        Paris

然后我使用此代码按“名称”分组:

g = df.groupby('Name')
for Name, df_2 in g:
    print(Name)
    print(df_2)
    print("\n")

这显示:

Bob
  Name    Value               timestamp     location
0  Bob        4     2020-10-01 09:00:00     New York
1  Bob        2     2020-10-02 09:00:00     New York
2  Bob        5     2020-10-05 09:00:00     New York

Jack
   Name   Value               timestamp     location
3  Jack       6     2020-10-06 09:00:00       London
4  Jack       9     2020-10-07 09:00:00       London
5  Jack       4     2020-10-08 09:00:00       London

Joe
   Name   Value               timestamp     location
6   Joe       3     2020-10-04 09:00:00        Paris
7   Joe       4     2020-10-05 09:00:00        Paris
8   Joe       2     2020-10-06 09:00:00        Paris

所以现在我有两件事想做。我想 1)删除“时间戳”列,然后 2)找到每个人的平均值。所以我试图产生以下输出:

Bob
   Name      Avg     location     
    Bob     3.66     New York

Jack
   Name     Avg      location
   Jack    6.33        London

Joe
   Name     Avg      location
    Joe       3         Paris

但是,我无法弄清楚如何操作由 groupby() 生成的数据帧。我尝试这段代码只是为了首先删除“时间戳”列:

g = df.groupby('Name')
for Name, df_2 in g:
    print(Name)
    print(df_2)
    print("\n")
    df.drop(columns=['timestamp'])

但是什么也没发生,这让我很困惑。这些数据帧是groupby()不是由实际的数据帧产生的?为什么我不能轻易删除我想要的任何列?

标签: pythonpandasdataframe

解决方案


您可以使用groupbywithagg为要聚合的列指定不同的函数。您想mean在“值”列上使用,并且由于每个人的“位置”都是相同的,您可以只保留first.

>>> df.groupby("Name").agg({"Value": "mean", "location": "first"})
         Value  location
Name                    
Bob   3.666667  New York
Jack  6.333333    London
Joe   3.000000     Paris

推荐阅读