将多列数据框更改为单列而不丢失 python 中的信息
Changing a many column dataframe to a single column without losing information in python
我想在比较多个数据帧时查看单元格值的变化。这些数据框由 JSON 数据组成,形成多列 table,我无法轻易更改此数据源。假设有 10 个具有 10 行和 10 列(相同标记)的数据帧。我想通过将每个数据帧变成 100 行和 1 列来比较信息。
对于 3x3 示例:
import pandas as pd
data = [{'a':1,'b':2,'c':3},{'a':10,'b':20,'c':30},{'a':100,'b':200,'c':300}]
df = pd.DataFrame(data)
df.index = ['x','y','z']
给出这个 table
a b c
x 1 2 3
y 10 20 30
z 100 200 300
但我想要:
col
xa 1
xb 2
xc 3
ya 10
yb 20
yc 30
za 100
zb 200
zc 300
这样我就可以添加许多列并比较值的变化。
有人可以告诉我如何使用 pandas 执行此操作吗?
如果需要第三列也没关系,即:
1 2 3
x a 1
x b 2
x c 3
y a 10
y b 20
y c 30
z a 100
z b 200
z c 300
尝试这样的事情
import pandas as pd
data = [{'a':1,'b':2,'c':3},{'a':10,'b':20,'c':30},{'a':100,'b':200,'c':300}]
df = pd.DataFrame(data)
df.index = ['x','y','z']
df_us = df.unstack().reset_index()
df_us.columns = [i for i in range(df_us.shape[1])]
df_us = df_us.sort_values(by=2)
使用DataFrame.stack
with Series.to_frame
,然后使用map
:
将MultiIndex
展平为index
df_us = df.stack().to_frame('col')
df_us.index = df_us.index.map(lambda x: f'{x[0]}{x[1]}')
print (df_us)
col
xa 1
xb 2
xc 3
ya 10
yb 20
yc 30
za 100
zb 200
zc 300
对于 3 列:
df_us = df.stack().reset_index()
df_us.columns = [0,1,2]
print (df_us)
0 1 2
0 x a 1
1 x b 2
2 x c 3
3 y a 10
4 y b 20
5 y c 30
6 z a 100
7 z b 200
8 z c 300
我想在比较多个数据帧时查看单元格值的变化。这些数据框由 JSON 数据组成,形成多列 table,我无法轻易更改此数据源。假设有 10 个具有 10 行和 10 列(相同标记)的数据帧。我想通过将每个数据帧变成 100 行和 1 列来比较信息。
对于 3x3 示例:
import pandas as pd
data = [{'a':1,'b':2,'c':3},{'a':10,'b':20,'c':30},{'a':100,'b':200,'c':300}]
df = pd.DataFrame(data)
df.index = ['x','y','z']
给出这个 table
a b c
x 1 2 3
y 10 20 30
z 100 200 300
但我想要:
col
xa 1
xb 2
xc 3
ya 10
yb 20
yc 30
za 100
zb 200
zc 300
这样我就可以添加许多列并比较值的变化。
有人可以告诉我如何使用 pandas 执行此操作吗? 如果需要第三列也没关系,即:
1 2 3
x a 1
x b 2
x c 3
y a 10
y b 20
y c 30
z a 100
z b 200
z c 300
尝试这样的事情
import pandas as pd
data = [{'a':1,'b':2,'c':3},{'a':10,'b':20,'c':30},{'a':100,'b':200,'c':300}]
df = pd.DataFrame(data)
df.index = ['x','y','z']
df_us = df.unstack().reset_index()
df_us.columns = [i for i in range(df_us.shape[1])]
df_us = df_us.sort_values(by=2)
使用DataFrame.stack
with Series.to_frame
,然后使用map
:
MultiIndex
展平为index
df_us = df.stack().to_frame('col')
df_us.index = df_us.index.map(lambda x: f'{x[0]}{x[1]}')
print (df_us)
col
xa 1
xb 2
xc 3
ya 10
yb 20
yc 30
za 100
zb 200
zc 300
对于 3 列:
df_us = df.stack().reset_index()
df_us.columns = [0,1,2]
print (df_us)
0 1 2
0 x a 1
1 x b 2
2 x c 3
3 y a 10
4 y b 20
5 y c 30
6 z a 100
7 z b 200
8 z c 300