【发布时间】:2021-10-15 07:13:23
【问题描述】:
我正在尝试获取代表大多数分组行的列值。假设我有以下数据框。
df = pd.read_csv("test2.csv")
print(df)
loc address mod1 mod2 mod3
0 A addr1 0 0 0
1 A addr1 0 1 0
2 A addr1 0 3 0
3 A addr1 0 3 0
4 A addr1 0 3 2
5 A addr1 0 3 2
6 A addr1 0 3 2
7 A addr2 0 0 0
8 A addr2 0 1 0
9 A addr2 0 1 0
10 B addr1 0 0 0
11 B addr1 0 0 2
12 B addr1 0 1 1
13 B addr1 0 0 2
14 B addr1 0 2 2
15 B addr2 0 1 0
16 C addr1 0 1 0
17 C addr1 0 0 1
“A addr1”组最能代表“mod2”的值为3,“A addr2”组为1。 为此,我使用以下代码:
a = df.groupby(['loc','address'])['mod2'] \
.value_counts() \
.groupby(['loc','address']) \
.nlargest(1) \
.reset_index(level=[0,1],drop=True) \
.rename_axis(['loc','address','mod2']) \
.reset_index(name='counts')[['loc','address','mod2']]
print(a)
loc address mod2
0 A addr1 3
1 A addr2 1
2 B addr1 0
3 B addr2 1
4 C addr1 0
但是,当所有组的列值相同时,此操作会失败并显示消息“ValueError:新名称的长度必须为 1,得到 3”。请参阅上面打印的第一个数据框中的“mod1”列。我使用了相同的代码,只是将“mod2”列更改为“mod1”。
c = df.groupby(['loc','address'])['mod1'] \
.value_counts() \
.groupby(['loc','address']) \
.nlargest(1) \
.reset_index(level=[0,1],drop=True) \
.rename_axis(['loc','address','mod1']) \
.reset_index(name='counts')[['loc','address','mod1']]
print(c)
失败发生在代码的“rename_axis”部分。 value_counts 的“Groupby”将“loc”和“address”添加为索引,nlargest 的“groupby”复制了“mod2”的这些索引。但是,“mod1”的 nlargest 的“groupby”不会复制相同的索引,因为第一个和第二个“groupby”的输出是相同的,因为该列的所有行的值都为零。 “reset_index” 删除了前两个级别,导致第一个示例具有“loc”、“address”和“mod2”列,而第二个示例只有“mod1”列。
有什么办法可以避免这种情况吗?或者有没有办法简化我想要实现的目标?
编辑:预期结果应该如下:
loc address mod1
0 A addr1 0
1 A addr2 0
2 B addr1 0
3 B addr2 0
4 C addr1 0
然后我会加入他们有以下输出:
loc address mod1 mod2
0 A addr1 0 3
1 A addr2 0 1
2 B addr1 0 0
3 B addr2 0 1
4 C addr1 0 0
【问题讨论】:
-
请您更新一下您的问题的预期结果吗?
-
@Corralien 我更新了我的帖子。