我有两个熊猫数据帧,一个带有原始数据,另一个是基于第一个数据帧的数据分析的分析输出。设置如下:
df1
P1T P2T P3T
P N P
N P U
P P U
U U N
df2
Indicator Indicator State Occurrences
P1T P
P1T N
P1T U
P2T P
P2T N
P2T U
P3T P
P3T N
P3T U
在df1
中,每一列代表一个“指示器”,并且每个指示器可以具有三种状态:“ P”,“ N”或“ U”。
df2
列出了每个“指标”及其可以具有的状态范围,每个代表不同的情况。然后应该计算每种情况的发生次数,然后在“发生次数”列中输出该次数。也就是说,
df2
Indicator Indicator State Occurrences
P1T P 2
P1T N 1
P1T U 1
P2T P 2
P2T N 1
P2T U 1
P3T P 1
P3T N 1
P3T U 2
是否可以使用df2['Indicators']
列中的值来指定df1
中的列来进行计数,然后使用df2['Indicator State']
列中的值来提供“ countif条件?
答案 0 :(得分:2)
将melt
与groupby
与MultiIndex Series
一起使用size
:
df3 = (df1.melt(var_name='Indicator', value_name='Indicator State')
.groupby(['Indicator','Indicator State'])
.size()
.rename('Occurrences'))
使用value_counts
和unstack
的另一种解决方案:
df3 = df1.apply(lambda x: x.value_counts()).unstack().rename('Occurrences')
print (df3)
Indicator Indicator State
P1T N 1
P 2
U 1
P2T N 1
P 2
U 1
P3T N 1
P 1
U 2
Name: Occurrences, dtype: int64
最后join
到原始DataFrame
:
#if necessary remove only NaN column
df2 = df2.drop('Occurrences', axis=1)
df2 = df2.join(df3, on=['Indicator','Indicator State'])
print (df2)
Indicator Indicator State Occurrences
0 P1T P 2
1 P1T N 1
2 P1T U 1
3 P2T P 2
4 P2T N 1
5 P2T U 1
6 P3T P 1
7 P3T N 1
8 P3T U 2