【发布时间】:2021-09-03 11:11:20
【问题描述】:
我有一组数据,我试图根据 A 列中的一个公共键将它们分组在一起,我希望它为每个分组的键值返回一行信息。分组很容易,但我的其他列返回我需要的值时遇到问题。这是数据框:
df = pd.DataFrame({'A': [1,2,1,2,3,3,3,4,5,6,6,4,5,5],
'B': [1.1,2.1,1.2,2.2,3.1,3.2,3.3,4.1,5.1,6.1,6.2,4.2,5.2,5.3],
'C':[10.1,20.1,10.1,20.1,30.1,30.1,30.1,40.1,50.1,60.1,60.1,40.1,50.1,50.1],
'D':['','',10.2,20.2,'','',30.2,'','','',60.2,40.2,'',50.2]
})
df
--------------------------------------------------------------------------------------------------
A B C D
0 1 1.1 10.1
1 2 2.1 20.1
2 1 1.2 10.1 10.2
3 2 2.2 20.1 20.2
4 3 3.1 30.1
5 3 3.2 30.1
6 3 3.3 30.1 30.2
7 4 4.1 40.1
8 5 5.1 50.1
9 6 6.1 60.1
10 6 6.2 60.1 60.2
11 4 4.2 40.1 40.2
12 5 5.2 50.1
13 5 5.3 50.1 50.2
我想按“A”列分组,让“B”列显示最小值,然后“D”列返回最大值。我的想要的输出看起来像这样:
A B C D
0 1 1.1 10.1 10.2
1 2 2.1 20.1 20.2
2 3 3.1 30.1 30.2
3 4 4.1 40.1 40.2
4 5 5.1 50.1 50.2
5 6 6.1 60.1 60.2
我尝试按“A”列分组,然后让“B”列仅提取每个分组键的最小值,然后在单行中显示“B”列中该最小值的剩余列值,但是它输出列“D”的 NaN 值。目前代码的输出如下所示:
df = df.loc[df.groupby('A')['B'].idxmin()]
df
------------------------------------------------------------------------------------------------
A B C D
0 1 1.1 10.1
1 2 2.1 20.1
4 3 3.1 30.1
7 4 4.1 40.1
8 5 5.1 50.1
9 6 6.1 60.1
我还尝试将 groupby 与 lambda 和 ffill().tail(1) 一起使用,并得到了我想要的列“D”的结果,但列“B”不是最小值/最小值。这是代码和输出:
out = df.replace({'': pd.NA}) \
.groupby("A", as_index=False) \
.apply(lambda x: x.ffill().tail(1)) \
.reset_index(level=0,drop=True)
df = out
df
-------------------------------------------------------------------------------------------------
A B C D
2 1 1.2 10.1 10.2
3 2 2.2 20.1 20.2
6 3 3.3 30.1 30.2
11 4 4.2 40.1 40.2
13 5 5.3 50.1 50.2
10 6 6.2 60.1 60.2
任何想法如何结合这两段代码来制作它,以便我根据公共键值在同一行中获得“A”列中的最小值和“B”列中的最大值。
感谢任何帮助。
【问题讨论】:
-
你应该考虑:
df.replace({'':float('nan')}).groupby('A').agg({'B':min, 'C':'first', 'D':max}) -
@Onyambu 我的真实数据集我在 C 和 D 列中都使用了日期时间,这些是需要最小和最大的。我没有在帖子中提到这一点,因为我不相信它会产生太大影响,但是我收到了 TypeError: '>=' not supported between instances 或 'str' and 'datetime.datetime'。我需要将我的日期时间更改为另一个 dtype 吗?
标签: python-3.x pandas dataframe lambda group-by