使用 panda (UNPIVOT) 将 table 更改为 tall 格式
Change table to tall format using panda (UNPIVOT)
我有一个table这样的
user company company2 company3 company4
1 Mac Lenovo Hp null
2 Mac MSI Sony
并使用 pandas 我希望它是
user company
1 Mac
1 Lenovo
1 Hp
2 Mac
等等
在这里我试过了但没有使用 pandas pivot.
dataframe = pd.read_csv('data.csv')
dataframe.fillna(value='', inplace=True)
#dataframe.pivot(index='user', columns='company')
以上代码不工作并给出错误。
你可以使用pd.melt方法:
In [211]: pd.melt(df, id_vars='user', value_vars=df.columns.drop('user').tolist())
Out[211]:
user variable value
0 1 company Mac
1 2 company Mac
2 1 company2 Lenovo
3 2 company2 MSI
4 1 company3 Hp
5 2 company3 Sony
6 1 company4 null
7 2 company4 NaN
或
In [213]: pd.melt(df,
id_vars='user', value_vars=df.columns.drop('user').tolist(),
value_name='Company') \
.drop('variable',1)
Out[213]:
user Company
0 1 Mac
1 2 Mac
2 1 Lenovo
3 2 MSI
4 1 Hp
5 2 Sony
6 1 null
7 2 NaN
更新: 删除 NaN 并按 user
对结果 DF 进行排序:
In [218]: pd.melt(df,
...: id_vars='user', value_vars=df.columns.drop('user').tolist(),
...: value_name='Company') \
...: .drop('variable',1) \
...: .dropna() \
...: .sort_values('user')
...:
Out[218]:
user Company
0 1 Mac
2 1 Lenovo
4 1 Hp
6 1 null
1 2 Mac
3 2 MSI
5 2 Sony
PS 如果您想摆脱 null
值 - 使用 df.replace('null', np.nan)
而不是 df
:
In [219]: pd.melt(df.replace('null', np.nan),
...: id_vars='user', value_vars=df.columns.drop('user').tolist(),
...: value_name='Company') \
...: .drop('variable',1) \
...: .dropna() \
...: .sort_values('user')
...:
Out[219]:
user Company
0 1 Mac
2 1 Lenovo
4 1 Hp
1 2 Mac
3 2 MSI
5 2 Sony
用stack
是可以的(不知道是不是比melt
更有效:
dataframe.set_index("user").stack().reset_index(-1, drop=True)
user
1 Mac
1 Lenovo
1 Hp
2 MSI
2 Mac
2 Sony
Stack 实质上将列推入索引(并创建 MultiIndex
)- 因此,对于每个列-行组合,您都会在新的 DataFrame
中得到一行。即 DataFrame
C1 C2
0 A B
1 a b
在 stack()
之后变成 Series
0 C1 A
0 C2 B
1 C1 a
1 C2 b
我有一个table这样的
user company company2 company3 company4
1 Mac Lenovo Hp null
2 Mac MSI Sony
并使用 pandas 我希望它是
user company
1 Mac
1 Lenovo
1 Hp
2 Mac
等等 在这里我试过了但没有使用 pandas pivot.
dataframe = pd.read_csv('data.csv')
dataframe.fillna(value='', inplace=True)
#dataframe.pivot(index='user', columns='company')
以上代码不工作并给出错误。
你可以使用pd.melt方法:
In [211]: pd.melt(df, id_vars='user', value_vars=df.columns.drop('user').tolist())
Out[211]:
user variable value
0 1 company Mac
1 2 company Mac
2 1 company2 Lenovo
3 2 company2 MSI
4 1 company3 Hp
5 2 company3 Sony
6 1 company4 null
7 2 company4 NaN
或
In [213]: pd.melt(df,
id_vars='user', value_vars=df.columns.drop('user').tolist(),
value_name='Company') \
.drop('variable',1)
Out[213]:
user Company
0 1 Mac
1 2 Mac
2 1 Lenovo
3 2 MSI
4 1 Hp
5 2 Sony
6 1 null
7 2 NaN
更新: 删除 NaN 并按 user
对结果 DF 进行排序:
In [218]: pd.melt(df,
...: id_vars='user', value_vars=df.columns.drop('user').tolist(),
...: value_name='Company') \
...: .drop('variable',1) \
...: .dropna() \
...: .sort_values('user')
...:
Out[218]:
user Company
0 1 Mac
2 1 Lenovo
4 1 Hp
6 1 null
1 2 Mac
3 2 MSI
5 2 Sony
PS 如果您想摆脱 null
值 - 使用 df.replace('null', np.nan)
而不是 df
:
In [219]: pd.melt(df.replace('null', np.nan),
...: id_vars='user', value_vars=df.columns.drop('user').tolist(),
...: value_name='Company') \
...: .drop('variable',1) \
...: .dropna() \
...: .sort_values('user')
...:
Out[219]:
user Company
0 1 Mac
2 1 Lenovo
4 1 Hp
1 2 Mac
3 2 MSI
5 2 Sony
用stack
是可以的(不知道是不是比melt
更有效:
dataframe.set_index("user").stack().reset_index(-1, drop=True)
user
1 Mac
1 Lenovo
1 Hp
2 MSI
2 Mac
2 Sony
Stack 实质上将列推入索引(并创建 MultiIndex
)- 因此,对于每个列-行组合,您都会在新的 DataFrame
中得到一行。即 DataFrame
C1 C2
0 A B
1 a b
在 stack()
之后变成 Series
0 C1 A
0 C2 B
1 C1 a
1 C2 b