Pandas 与第三列的交叉表
Pandas Crosstab with third column
我有一个看起来像这样的 Dataframe df
,尽管我有 20 多个 P(n)
列;
Time Speed P1 P2 Ratio
1 100 2 NaN 1.2
2 150 3 NaN 1.3
3 500 4 NaN 1.4
4 500 5 NaN 1.5
5 900 NaN 7 1.6
6 150 NaN 6 1.7
7 100 NaN 8 1.8
我正在尝试对这些数据进行交叉制表以构建一个新的 Dataframe,Ratio
值对应 Speed
和 P(n)
的每个值。这样结果看起来像这样;
Time Speed P1 P2
1 100 1.2 NaN
2 150 1.3 NaN
3 500 1.4 NaN
4 500 1.5 NaN
5 900 NaN 1.6
6 150 NaN 1.7
7 100 NaN 1.8
基本上,我的目标是将 P(n)
的值替换为 Ratio
的值。
这似乎是一项简单的任务,但我却被困在这里。我曾尝试使用 pandas 交叉表,但似乎只能利用两个变量来 return 实例数而不是值。我试过了;
new_df = pd.crosstab(df['Speed'], df['Ratio'].fillna('n/a'))
是否可以使用 pd.crosstab
来实现此目的或是否有其他方法可用?
使用DataFrame.filter
for get DataFrame with columsn starting by P
and then for replace use DataFrame.mask
for not missing values tested by DataFrame.notna
:
df1 = df.filter(regex='^P')
df[df1.columns] = df1.mask(df1.notna(), df['Ratio'], axis=0)
print (df)
Time Speed P1 P2 Ratio
0 1 100 1.2 NaN 1.2
1 2 150 1.3 NaN 1.3
2 3 500 1.4 NaN 1.4
3 4 500 1.5 NaN 1.5
4 5 900 NaN 1.6 1.6
5 6 150 NaN 1.7 1.7
6 7 100 NaN 1.8 1.8
我有一个看起来像这样的 Dataframe df
,尽管我有 20 多个 P(n)
列;
Time Speed P1 P2 Ratio
1 100 2 NaN 1.2
2 150 3 NaN 1.3
3 500 4 NaN 1.4
4 500 5 NaN 1.5
5 900 NaN 7 1.6
6 150 NaN 6 1.7
7 100 NaN 8 1.8
我正在尝试对这些数据进行交叉制表以构建一个新的 Dataframe,Ratio
值对应 Speed
和 P(n)
的每个值。这样结果看起来像这样;
Time Speed P1 P2
1 100 1.2 NaN
2 150 1.3 NaN
3 500 1.4 NaN
4 500 1.5 NaN
5 900 NaN 1.6
6 150 NaN 1.7
7 100 NaN 1.8
基本上,我的目标是将 P(n)
的值替换为 Ratio
的值。
这似乎是一项简单的任务,但我却被困在这里。我曾尝试使用 pandas 交叉表,但似乎只能利用两个变量来 return 实例数而不是值。我试过了;
new_df = pd.crosstab(df['Speed'], df['Ratio'].fillna('n/a'))
是否可以使用 pd.crosstab
来实现此目的或是否有其他方法可用?
使用DataFrame.filter
for get DataFrame with columsn starting by P
and then for replace use DataFrame.mask
for not missing values tested by DataFrame.notna
:
df1 = df.filter(regex='^P')
df[df1.columns] = df1.mask(df1.notna(), df['Ratio'], axis=0)
print (df)
Time Speed P1 P2 Ratio
0 1 100 1.2 NaN 1.2
1 2 150 1.3 NaN 1.3
2 3 500 1.4 NaN 1.4
3 4 500 1.5 NaN 1.5
4 5 900 NaN 1.6 1.6
5 6 150 NaN 1.7 1.7
6 7 100 NaN 1.8 1.8