首页 > 解决方案 > 熊猫复制数据但旋转列

问题描述

我想转换这个 DF

地点 日期 F1_ID F1_名称 F1_高度 F1_状态 F2_ID F2_名称 F2_高度 F2_状态
美国 19 年 12 月 31 日 1 乔恩 67 W 2 安东尼 68 大号

通过复制行但切换数据到这个 DF。

地点 日期 F1_ID F1_名称 F1_高度 F1_状态 F2_ID F2_名称 F2_高度 F2_状态
美国 19 年 12 月 31 日 1 乔恩 67 W 2 安东尼 68 大号
美国 19 年 12 月 31 日 2 安东尼 68 大号 1 乔恩 67 W

我怎样才能在 Pandas 中实现这一点。我尝试创建 df 的副本并重命名列,但由于唯一索引而出现错误

标签: pythonpandas

解决方案


让我们尝试一个concatsort_index

import re

import pandas as pd

df = pd.DataFrame(
    {'Location': {0: 'USA'}, 'Date': {0: '12/31/19'},
     'F1_ID': {0: 1}, 'F1_Name': {0: 'Jon'}, 'F1_Height': {0: 67},
     'F1_Status': {0: 'W'}, 'F2_ID': {0: 2},
     'F2_Name': {0: 'Anthony'}, 'F2_Height': {0: 68},
     'F2_Status': {0: 'L'}})

# Columns Not To Swap
keep_columns = ['Location', 'Date']
# Get F1 and F2 Column Names
f1_columns = list(filter(re.compile(r'F1_').search, df.columns))
f2_columns = list(filter(re.compile(r'F2_').search, df.columns))
# Create Inverse DataFrame
inverse_df = df[[*keep_columns, *f2_columns, *f1_columns]]
# Set Columns so they match df (prevents concat from un-inverting)
inverse_df.columns = df.columns

# Concat and sort index
new_df = pd.concat((df, inverse_df)).sort_index().reset_index(drop=True)
print(new_df.to_string())

源:

  Location      Date  F1_ID F1_Name  F1_Height F1_Status  F2_ID  F2_Name  F2_Height F2_Status
0      USA  12/31/19      1     Jon         67         W      2  Anthony         68         L

输出:

  Location      Date  F1_ID  F1_Name  F1_Height F1_Status  F2_ID  F2_Name  F2_Height F2_Status
0      USA  12/31/19      1      Jon         67         W      2  Anthony         68         L
1      USA  12/31/19      2  Anthony         68         L      1      Jon         67         W

推荐阅读