按分组行获取唯一值

2024-05-16 10:56:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在执行groupby(“a”)之前,我有一个类似的系列,我想看看这些组之间的组成差异:

    A    B    C
1  us   air   35
2  us   gas   34
3  us   sun   30
4  us   fog   23
5  us   mud   33
6  fr   air   45
7  fr   bug   15
8  fr   sun   35
9  fr   mud   85
      ...

有谁能帮我看一下组的差异吗? 我需要的是:

us    [air,gas,sun,fog,mud]
eu    [air,gas,sun,fog]
fr    [air,bug,sun,mud]

非常感谢你,我非常感谢你的帮助

--更新

data is here

我想看看每天的作文是否都一样。 当我尝试groupby('MonitorDate')['ItemEngName'].unique()时,它不起作用

提前谢谢

--更新

多亏了@Perldf.groupby('MonitorDate')['ItemEngName'].apply(list)有效。但这不是我想要的。我想要的是在一天内得到一个独特的组合(如set)。类似于在groupby之后使用set(['ItemEngName']

所以我试着df.groupby('MonitorDate')['ItemEngName'].unique()并且

MonitorDate 
2010/1/1    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/2    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/3    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/4    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/5    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/6    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
2010/1/7    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...
Name:     ItemEngName, dtype: object

除了1/7外,它们似乎都一样。 但我需要手动检查差异

--更新

预期产出:

再次感谢@perl

MonitorDate 
2010/1/1    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ..., WS_HR]
2010/1/7    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...]
Name:     ItemEngName, dtype: object

对于更多数据情况,更复杂的条件如下:

MonitorDate 
2010/1/1    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ..., WS_HR] (full)
2010/1/7    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, PM2.5, ...] ..(lack WS_HR)
2010/1/8    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM2.5, ..., WS_HR] .(lack PM10)
2010/1/9    [AMB_TEMP, CO, NO, NO2, NOx, O3, PM10, , ...] .......(lack PM2.5)
...
Name:     ItemEngName, dtype: object

我只能使用df.groupby('MonitorDate')["ItemEngName"].nunique().unique()来知道不同数量的项目,但不知道组件的差异。 有什么有效的方法吗


Tags: nofrairtempsunusgroupbyco
1条回答
网友
1楼 · 发布于 2024-05-16 10:56:51

您可以groupby列A,然后取B列并将分组值转换为具有apply的列表:

df.groupby('A')['B'].apply(list)

输出:

A
fr         [air, bug, sun, mud]
us    [air, gas, sun, fog, mud]
Name: B, dtype: object

如果列表可能有重复项,而您只对唯一值感兴趣,那么最好的选择可能是使用@anky评论中的解决方案:

df.groupby('A')['B'].unique()

更新:在您的数据集中,它们几乎相同,除了2010/1/7没有WS_HR

df[['MonitorDate', 'ItemEngName']].value_counts().unstack()

输出:

ItemEngName  AMB_TEMP   CO   NO  NO2  NOx   O3  PM10  PM2.5   RH  SO2  WD_HR  \
MonitorDate                                                                    
2010/1/1          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/2          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/3          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/4          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/5          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/6          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   
2010/1/7          1.0  1.0  1.0  1.0  1.0  1.0   1.0    1.0  1.0  1.0    1.0   

ItemEngName  WIND_DIREC  WIND_SPEED  WS_HR  
MonitorDate                                 
2010/1/1            1.0         1.0    1.0  
2010/1/2            1.0         1.0    1.0  
2010/1/3            1.0         1.0    1.0  
2010/1/4            1.0         1.0    1.0  
2010/1/5            1.0         1.0    1.0  
2010/1/6            1.0         1.0    1.0  
2010/1/7            1.0         1.0    NaN 

更新2:如果您只想直观地检查哪些天有哪些项目,您可以绘制它。例如,在这里您可以看到WS_HR上缺少2010/1/7

z = df[['MonitorDate', 'ItemEngName']].value_counts().unstack()
plt.pcolor(z, alpha=0.2)
plt.yticks(np.arange(0.5, len(z.index), 1), z.index)
plt.xticks(np.arange(0.5, len(z.columns), 1), z.columns, rotation=90)
plt.show()

输出:

picture

相关问题 更多 >