我如何根据列切片中的行值创建列 headers,从而使列行值与列 headers 匹配?
How can I create column headers from row values in a slice of columns resulting in the column row values matching the column headers?
我想将数据框的行值转换为 header 列,但我只想要同名的一列。然后我希望每个新列下的行值与列 header 相同。我试过查看 get_dummies、pivot、pivot_table、group_by。任何帮助将不胜感激。
数据:
导入 pandas 作为 pd
In [1]: df = pd.DataFrame([['foo', 'bar', 'ham'], ['baz', 'foo', 'bar'], ['ham', 'baz', 'egg']], columns=['A', 'B', 'C'])
In [2]: df
Out[2]:
A B C
0 foo bar ham
1 baz foo bar
2 ham baz egg
我想要这个:
In [3]:
Out[3]:
foo bar baz ham egg
0 foo bar ham
1 foo bar baz
2 baz ham egg
谢谢。
思路是先将DataFrame转为长格式,然后进行pivot:
df = df.reset_index()
df = pd.melt(df, id_vars=['index']).pivot(index = 'index', values='variable', columns='value')
for c in df.columns:
df.loc[df[c].notna(), c] = c
value bar baz egg foo ham
index
0 bar NaN NaN foo ham
1 bar baz NaN foo NaN
2 NaN baz egg NaN ham
详细解释:
melt
会将 DataFrame 转换为以下形式:
index variable value
0 0 A foo
1 1 A baz
2 2 A ham
3 0 B bar
4 1 B foo
5 2 B baz
6 0 C ham
7 1 C bar
8 2 C egg
然后使用 pivot 使列成为所有唯一值:
value bar baz egg foo ham
index
0 B NaN NaN A C
1 C A NaN B NaN
2 NaN B C NaN A
然后只需将所有非 na 列替换为列名即可。
我想将数据框的行值转换为 header 列,但我只想要同名的一列。然后我希望每个新列下的行值与列 header 相同。我试过查看 get_dummies、pivot、pivot_table、group_by。任何帮助将不胜感激。
数据:
导入 pandas 作为 pd
In [1]: df = pd.DataFrame([['foo', 'bar', 'ham'], ['baz', 'foo', 'bar'], ['ham', 'baz', 'egg']], columns=['A', 'B', 'C'])
In [2]: df
Out[2]:
A B C
0 foo bar ham
1 baz foo bar
2 ham baz egg
我想要这个:
In [3]:
Out[3]:
foo bar baz ham egg
0 foo bar ham
1 foo bar baz
2 baz ham egg
谢谢。
思路是先将DataFrame转为长格式,然后进行pivot:
df = df.reset_index()
df = pd.melt(df, id_vars=['index']).pivot(index = 'index', values='variable', columns='value')
for c in df.columns:
df.loc[df[c].notna(), c] = c
value bar baz egg foo ham
index
0 bar NaN NaN foo ham
1 bar baz NaN foo NaN
2 NaN baz egg NaN ham
详细解释:
melt
会将 DataFrame 转换为以下形式:
index variable value
0 0 A foo
1 1 A baz
2 2 A ham
3 0 B bar
4 1 B foo
5 2 B baz
6 0 C ham
7 1 C bar
8 2 C egg
然后使用 pivot 使列成为所有唯一值:
value bar baz egg foo ham
index
0 B NaN NaN A C
1 C A NaN B NaN
2 NaN B C NaN A
然后只需将所有非 na 列替换为列名即可。