转置 pandas 数据帧并垂直附加
transpose pandas dataframe and appending vertically
我目前有一个 Pandas 数据框,像这样 df
df = pd.DataFrame({'Name': ['A','B','C'], 'Type': ['Car', 'Car', 'Truck'] , '01/01/1991, RED': [10, 26, 30], '01/02/1991, YELLOW': [11,15,5], '01/05/1991, BLUE':[5,8,20]})
Name | Type | 01/01/1991, RED | 01/02/1991, YELLOW | 01/05/1991, BLUE |
A | Car | 10 | 11 | 5 |
B | Car | 26 | 15 | 8 |
C | Truck | 30 | 5 | 20 |
我正在寻找
的输出
Name | Date | Type | Color | Number
A | 01/01/1991 | Car | RED | 10
A | 01/02/1991 | Car | YELLOW | 11
A | 01/05/1991 | Car | BLUE | 5
B | 01/01/1991 | Car | RED | 26
B | 01/02/1991 | Car | YELLOW | 15
B | 01/05/1991 | Car | BLUE | 8
C | 01/01/1991 | Truck | RED | 30
C | 01/02/1991 | Truck | YELLOW | 5
C | 01/05/1991 | Truck | BLUE | 20
到目前为止,我可以转置 table 并清理日期。但我不确定如何按照以下方式复制日期并设置颜色。对于这种情况,.pivot_table 或 .transpose() 会更好吗?任何见解表示赞赏。
首先,使用melt
data = df.melt(id_vars=['Name', 'Type'], value_name='Number')
然后将variable
列分成两列
data[['Date', 'Color']] = data['variable'].str.split(',', 1, expand=True)
最后删除 variable
列,并按名称和日期排序
data = data.drop(['variable'], axis=1).sort_values(by=['Name', 'Date'])
试试这个,有很多方法可以解决这个重塑问题:
dfi = df.set_index(["Name", "Type"])
dfi.columns = dfi.columns.str.split(", ", expand=True).rename(['Date', 'Color'])
df_out = (
dfi.stack([0, 1])
.rename("Number")
.reset_index()
)
df_out
输出:
Name Type Date Color Number
0 A Car 01/01/1991 RED 10.0
1 A Car 01/02/1991 YELLOW 11.0
2 A Car 01/05/1991 BLUE 5.0
3 B Car 01/01/1991 RED 26.0
4 B Car 01/02/1991 YELLOW 15.0
5 B Car 01/05/1991 BLUE 8.0
6 C Truck 01/01/1991 RED 30.0
7 C Truck 01/02/1991 YELLOW 5.0
8 C Truck 01/05/1991 BLUE 20.0
解释:
将 'Name' 和 'Type' 移动到索引中,将剩余列的列 headers 拆分为逗号和 space 以创建多索引列 headers。接下来,将两个级别堆叠到索引,然后进行一些重命名以根据需要创建列和 reset_index.
您可以使用此管道:
(df.melt(id_vars=['Name', 'Type'], value_name='Number')
.assign(Date=lambda d: d['variable'].str[:10],
Color=lambda d: d['variable'].str[12:])
.drop('variable', axis=1)
)
这会将数据框融化为长格式,并从原始列名中提取日期和颜色。
输出:
Name Type Number Date Color
0 A Car 10 01/01/1991 RED
1 B Car 26 01/01/1991 RED
2 C Truck 30 01/01/1991 RED
3 A Car 11 01/02/1991 YELLOW
4 B Car 15 01/02/1991 YELLOW
5 C Truck 5 01/02/1991 YELLOW
6 A Car 5 01/05/1991 BLUE
7 B Car 8 01/05/1991 BLUE
8 C Truck 20 01/05/1991 BLUE
您可以使用 pivot_longer from pyjanitor 来抽象重塑过程 - 在内部它使用 pd.melt/pd.concat :
# pip install pyjanitor
import pandas as pd
import janitor
df.pivot_longer(['Name', 'Type'],
names_to = ('Date', 'Color'),
names_sep = ', ',
sort_by_appearance = True)
Name Type Date Color value
0 A Car 01/01/1991 RED 10
1 A Car 01/02/1991 YELLOW 11
2 A Car 01/05/1991 BLUE 5
3 B Car 01/01/1991 RED 26
4 B Car 01/02/1991 YELLOW 15
5 B Car 01/05/1991 BLUE 8
6 C Truck 01/01/1991 RED 30
7 C Truck 01/02/1991 YELLOW 5
8 C Truck 01/05/1991 BLUE 20
我目前有一个 Pandas 数据框,像这样 df
df = pd.DataFrame({'Name': ['A','B','C'], 'Type': ['Car', 'Car', 'Truck'] , '01/01/1991, RED': [10, 26, 30], '01/02/1991, YELLOW': [11,15,5], '01/05/1991, BLUE':[5,8,20]})
Name | Type | 01/01/1991, RED | 01/02/1991, YELLOW | 01/05/1991, BLUE |
A | Car | 10 | 11 | 5 |
B | Car | 26 | 15 | 8 |
C | Truck | 30 | 5 | 20 |
我正在寻找
的输出Name | Date | Type | Color | Number
A | 01/01/1991 | Car | RED | 10
A | 01/02/1991 | Car | YELLOW | 11
A | 01/05/1991 | Car | BLUE | 5
B | 01/01/1991 | Car | RED | 26
B | 01/02/1991 | Car | YELLOW | 15
B | 01/05/1991 | Car | BLUE | 8
C | 01/01/1991 | Truck | RED | 30
C | 01/02/1991 | Truck | YELLOW | 5
C | 01/05/1991 | Truck | BLUE | 20
到目前为止,我可以转置 table 并清理日期。但我不确定如何按照以下方式复制日期并设置颜色。对于这种情况,.pivot_table 或 .transpose() 会更好吗?任何见解表示赞赏。
首先,使用melt
data = df.melt(id_vars=['Name', 'Type'], value_name='Number')
然后将variable
列分成两列
data[['Date', 'Color']] = data['variable'].str.split(',', 1, expand=True)
最后删除 variable
列,并按名称和日期排序
data = data.drop(['variable'], axis=1).sort_values(by=['Name', 'Date'])
试试这个,有很多方法可以解决这个重塑问题:
dfi = df.set_index(["Name", "Type"])
dfi.columns = dfi.columns.str.split(", ", expand=True).rename(['Date', 'Color'])
df_out = (
dfi.stack([0, 1])
.rename("Number")
.reset_index()
)
df_out
输出:
Name Type Date Color Number
0 A Car 01/01/1991 RED 10.0
1 A Car 01/02/1991 YELLOW 11.0
2 A Car 01/05/1991 BLUE 5.0
3 B Car 01/01/1991 RED 26.0
4 B Car 01/02/1991 YELLOW 15.0
5 B Car 01/05/1991 BLUE 8.0
6 C Truck 01/01/1991 RED 30.0
7 C Truck 01/02/1991 YELLOW 5.0
8 C Truck 01/05/1991 BLUE 20.0
解释:
将 'Name' 和 'Type' 移动到索引中,将剩余列的列 headers 拆分为逗号和 space 以创建多索引列 headers。接下来,将两个级别堆叠到索引,然后进行一些重命名以根据需要创建列和 reset_index.
您可以使用此管道:
(df.melt(id_vars=['Name', 'Type'], value_name='Number')
.assign(Date=lambda d: d['variable'].str[:10],
Color=lambda d: d['variable'].str[12:])
.drop('variable', axis=1)
)
这会将数据框融化为长格式,并从原始列名中提取日期和颜色。
输出:
Name Type Number Date Color
0 A Car 10 01/01/1991 RED
1 B Car 26 01/01/1991 RED
2 C Truck 30 01/01/1991 RED
3 A Car 11 01/02/1991 YELLOW
4 B Car 15 01/02/1991 YELLOW
5 C Truck 5 01/02/1991 YELLOW
6 A Car 5 01/05/1991 BLUE
7 B Car 8 01/05/1991 BLUE
8 C Truck 20 01/05/1991 BLUE
您可以使用 pivot_longer from pyjanitor 来抽象重塑过程 - 在内部它使用 pd.melt/pd.concat :
# pip install pyjanitor
import pandas as pd
import janitor
df.pivot_longer(['Name', 'Type'],
names_to = ('Date', 'Color'),
names_sep = ', ',
sort_by_appearance = True)
Name Type Date Color value
0 A Car 01/01/1991 RED 10
1 A Car 01/02/1991 YELLOW 11
2 A Car 01/05/1991 BLUE 5
3 B Car 01/01/1991 RED 26
4 B Car 01/02/1991 YELLOW 15
5 B Car 01/05/1991 BLUE 8
6 C Truck 01/01/1991 RED 30
7 C Truck 01/02/1991 YELLOW 5
8 C Truck 01/05/1991 BLUE 20