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

How to use the values in a column to identify which column to analyse in a different dataframe?

我有两个pandasdataframes,一个是原始数据,另一个是基于第一个dataframe的数据分析得到的分析输出。设置如下:

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中,每一列代表一个'Indicator',每个指标可以有三种状态:'P'、'N'或'U'。

df2 列出每个 'Indicator' 及其可以拥有的状态范围,每个代表不同的情况。然后应该计算每个案例的出现次数并在 'Occurrences' 列中输出该数字。也就是说,

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

MultiIndex Series使用melt with groupby and size:

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

另一个解决方案value_counts and 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