如何使用列中的值来识别要在不同数据框中分析的列?
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
我有两个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