如何使用列中的值来标识要在不同数据框中分析的列?

时间:2018-12-12 14:29:05

标签: python pandas dataframe analysis

我有两个熊猫数据帧,一个带有原始数据,另一个是基于第一个数据帧的数据分析的分析输出。设置如下:

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条件?

1 个答案:

答案 0 :(得分:2)

meltgroupbyMultiIndex Series一起使用size

df3 = (df1.melt(var_name='Indicator', value_name='Indicator State')
         .groupby(['Indicator','Indicator State'])
         .size()
         .rename('Occurrences'))

使用value_countsunstack的另一种解决方案:

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