Pandas 融化具有多个值列的数据框
Pandas melt dataframe with multiple value columns
我有以下数据框:
x = pd.DataFrame([
{'F1': 'a', 'F1_D': 'aa', 'F2': 'a', 'F2_D': 'aa', 'F3': 'a', 'F3_D': 'aa'},
{'F1': 'b', 'F1_D': 'bb', 'F2': 'b', 'F2_D': 'bb', 'F3': 'b', 'F3_D': 'bb'},
{'F1': 'c', 'F1_D': 'cc', 'F2': 'c', 'F2_D': 'cc', 'F3': 'c', 'F3_D': 'cc'},
{'F1': 'd', 'F1_D': 'dd', 'F2': 'd', 'F2_D': 'dd', 'F3': 'd', 'F3_D': 'dd'},
])
>>>x
F1 F1_D F2 F2_D F3 F3_D
0 a aa a aa a aa
1 b bb b bb b bb
2 c cc c cc c cc
3 d dd d dd d dd
我想将此数据框转换为长格式但有两个值变量,如下所示:
col1 col2 col3
F1 a aa
F2 a aa
F3 a aa
F1 b bb
F2 b bb
. . .
. . .
. . .
F3 d dd
如果在 rename
中未以 _D
结尾,则首先为列名添加 _col2
:
f = lambda x: f'{x}' if x.endswith('_D') else f'{x}_col2'
x = x.rename(columns=f)
print (x)
F1_col2 F1_D F2_col2 F2_D F3_col2 F3_D
0 a aa a aa a aa
1 b bb b bb b bb
2 c cc c cc c cc
3 d dd d dd d dd
然后用 _
和 DataFrame.stack
, last use DataFrame.rename_axis
and DataFrame.reset_index
通过 split
重塑一些数据清理:
x.columns = x.columns.str.split('_', expand=True)
df = (x.stack(0)
.rename_axis([None, 'col1'])
.reset_index(level=1)
.reset_index(drop=True)
.rename(columns={'D':'col3'}))
print (df)
col1 col3 col2
0 F1 aa a
1 F2 aa a
2 F3 aa a
3 F1 bb b
4 F2 bb b
5 F3 bb b
6 F1 cc c
7 F2 cc c
8 F3 cc c
9 F1 dd d
10 F2 dd d
11 F3 dd d
我有以下数据框:
x = pd.DataFrame([
{'F1': 'a', 'F1_D': 'aa', 'F2': 'a', 'F2_D': 'aa', 'F3': 'a', 'F3_D': 'aa'},
{'F1': 'b', 'F1_D': 'bb', 'F2': 'b', 'F2_D': 'bb', 'F3': 'b', 'F3_D': 'bb'},
{'F1': 'c', 'F1_D': 'cc', 'F2': 'c', 'F2_D': 'cc', 'F3': 'c', 'F3_D': 'cc'},
{'F1': 'd', 'F1_D': 'dd', 'F2': 'd', 'F2_D': 'dd', 'F3': 'd', 'F3_D': 'dd'},
])
>>>x
F1 F1_D F2 F2_D F3 F3_D
0 a aa a aa a aa
1 b bb b bb b bb
2 c cc c cc c cc
3 d dd d dd d dd
我想将此数据框转换为长格式但有两个值变量,如下所示:
col1 col2 col3
F1 a aa
F2 a aa
F3 a aa
F1 b bb
F2 b bb
. . .
. . .
. . .
F3 d dd
如果在 rename
中未以 _D
结尾,则首先为列名添加 _col2
:
f = lambda x: f'{x}' if x.endswith('_D') else f'{x}_col2'
x = x.rename(columns=f)
print (x)
F1_col2 F1_D F2_col2 F2_D F3_col2 F3_D
0 a aa a aa a aa
1 b bb b bb b bb
2 c cc c cc c cc
3 d dd d dd d dd
然后用 _
和 DataFrame.stack
, last use DataFrame.rename_axis
and DataFrame.reset_index
通过 split
重塑一些数据清理:
x.columns = x.columns.str.split('_', expand=True)
df = (x.stack(0)
.rename_axis([None, 'col1'])
.reset_index(level=1)
.reset_index(drop=True)
.rename(columns={'D':'col3'}))
print (df)
col1 col3 col2
0 F1 aa a
1 F2 aa a
2 F3 aa a
3 F1 bb b
4 F2 bb b
5 F3 bb b
6 F1 cc c
7 F2 cc c
8 F3 cc c
9 F1 dd d
10 F2 dd d
11 F3 dd d