python - 如何从 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()
不是由实际的数据帧产生的?为什么我不能轻易删除我想要的任何列?
解决方案
您可以使用groupby
withagg
为要聚合的列指定不同的函数。您想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
推荐阅读
- pagespeed-insights - 灯塔返回错误:出了点问题。无法运行 PageSpeed Insights
- c# - 索引器运行时,将文档上传或合并到 Azure 搜索索引是否会更新数据源?
- java - 需要一点帮助才能显示我的标题屏幕
- java - 从 gradle 4.x 升级到 6.x 以运行 Cucumber+Testng TestRunner 后面临的问题
- machine-learning - 从 C++ 导出到 Unischema/Petastorm
- c# - unity拦截事件触发器IsInvoking()
- javascript - 服务工作者 - 确定客户端是否为移动设备的最佳方法
- dictionary - 如何从机器人框架中的嵌套字典变量中提取值?
- c++ - 未在 CLion 中使用 sqlite3_exec 创建 SQLite 表
- go - 尝试编写共享的 protobuf 定义