为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Pandas 展平数据

使用 Pandas 展平数据

喵喔喔 2023-02-15 16:54:10
如何更改包含 Small_X、Large_X(其中 X 是数字 1、2、3 等)的列需要与传播到新记录的所有其他值一起展开,一个名为“New_Column”的新列将是添加表示 X 值。import pandas as pddata = {'Time':  ['12/1/19 0:00', '12/1/19 0:05'],    'Small_1': [1, 0],    'Large_1': [0, 0],    'Con_1': [0, 0],    'Small_2': [0, 0],    'Large_2': [0, 0],    'Con_2': [0, 0],    'Small_10': [1, 0],    'large_10': [0, 0],    'Con_10': [0, 0],    'Some_other_value': [78, 96],    }df = pd.DataFrame(data)以上输入数据应使用 Pandas 生成以下格式。
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

替代代码:

下面的代码使用.stack(),.unstack().pivot_table()。它有选择地只选择在要拆分的列表中指定字符串smalllarge,的列名。conkey

注意

  1. 输出aggfunc=np.max在 中聚合.pivot_table()。这可以根据需要更改为任何其他类型的聚合方法,例如np.min,np.sum或自定义函数

  2. 原来的列名改为小写,除了Time

代码:

# Import libraries

import pandas as pd


# Create DataFrame (copy pasted from question above)

data = {'Time':  ['12/1/19 0:00', '12/1/19 0:05'],

    'Small_1': [1, 0],

    'Large_1': [0, 0],

    'Con_1': [0, 0],

    'Small_2': [0, 0],

    'Large_2': [0, 0],

    'Con_2': [0, 0],

    'Small_10': [1, 0],

    'large_10': [0, 0],

    'Con_10': [0, 0],

    'Some_other_value': [78, 96],

    }

df = pd.DataFrame(data)


# Set Time as index

df = df.set_index('Time')


# Rename columns

df.columns = df.columns.str.lower() # change case to lower


# Stack

df = df.stack().reset_index() # convert columns to rows


# Split based on condition

key = ['small', 'large','con'] # Column names to be split

df['col1'] = df['level_1'].apply(lambda x: x.split('_')[0] if x.split('_')[0] in key else x)

df['New_Column'] = df['level_1'].apply(lambda x: x.split('_')[1] if x.split('_')[0] in key else np.NaN)


# Drop/rename columns

df = df.drop(['level_1'], axis=1)

df.columns.name=''


# Pivot using aggregate function: np.max

df = df.pivot_table(index=['Time', 'New_Column'], columns='col1', values=0, aggfunc=np.max)


# Rearrange

df = df.reset_index()

df.columns.name=''

df = df[['Time','small', 'large', 'con', 'New_Column']]

输出


print(df)


           Time  small  large  con New_Column

0  12/1/19 0:00      1      0    0          1

1  12/1/19 0:00      1      0    0         10

2  12/1/19 0:00      0      0    0          2

3  12/1/19 0:05      0      0    0          1

4  12/1/19 0:05      0      0    0         10

5  12/1/19 0:05      0      0    0          2


查看完整回答
反对 回复 2023-02-15
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我首先建议filter感兴趣的列,然后是melt列,然后是split“_”上的列名称,然后是pivot数据框:


# Filter columns

df = df.filter(regex=r"^([Cc]on|[Ll]arge|[Ss]mall|Time).*") 


# Melt dataframe

new = df.melt(id_vars="Time")


# Split column name

new[["variable", "New_Column"]] = new.variable.str.split("_", expand=True)


# Set variable as title

new["variable"] = new.variable.str.title()


# Pivot dataframe

new = pd.pivot_table(new, index=["Time", "New_Column"], values="value", columns="variable")


print(new.reset_index())        


查看完整回答
反对 回复 2023-02-15
  • 2 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号