熊猫将属性值更改为对象的行值

时间:2019-08-28 15:40:03

标签: python pandas pivot multiple-columns rows

目前从文件中解析出的数据聚合:

obj    price1*red    price1*blue    price2*red    price2*blue
a      5             7              10            12
b      15            17             20            22

期望的结果:

obj    color    price1    price2
a      red      5         7
a      blue     10        12
b      red      15        17
b      blue     20        22

此示例已简化。实际用例的数据将持续存在404列和10,000行。数据大多具有大约99种颜色的位置和4种不同的价目表(价目表始终是4种)。

我已经尝试了与之前在python中编程的另一部分不同的方法

df_pricelist = pd.melt(df_pricelist, id_vars=["object_nr"], var_name='color', value_name='prices')

但是这种方法最初用于将数据从单个属性转到多行。换句话说,对于不同的价目表,只有一个单元格,而不是多个单元格。

在这里我还使用了assign将字符串的不同块添加到不同的列单元格中。

要将所有不同的列都放入数据框,我使用str.startswith。这样,我不必知道可能存在的所有不同颜色。

1 个答案:

答案 0 :(得分:0)

使用MultiIndex作为中间步骤的解决方案:

import pandas as pd

# Construct example dataframe
col_names = ["obj", "price1*red", "price1*blue", "price2*red", "price2*blue"]
data = [
    ["a", 5, 7, 10, 12],
    ["b", 15, 17, 20, 22],
]
df = pd.DataFrame(data, columns=col_names)

# Convert objects column into rows index
df2 = df.set_index("obj")

# Convert columns index into two-level multi-index by splitting name strings
color_price_pairs = [tuple(col_name.split("*")) for col_name in df2.columns]
df2.columns = pd.MultiIndex.from_tuples(color_price_pairs, names=("price", "color"))

# Stack colors-level of the columns index into a rows index level
df2 = df2.stack()
df2.columns.name = ""

# Optional: convert rows index (containing objects and colors) into columns
df2 = df2.reset_index()

这是打印输出,显示原始数据帧df和结果数据帧df2

In [1] df
Out[1]: 
  obj  price1*red  price1*blue  price2*red  price2*blue
0   a           5            7          10           12
1   b          15           17          20           22

In [2]: df2
Out[2]: 
  obj color  price1  price2
0   a  blue       7      12
1   a   red       5      10
2   b  blue      17      22
3   b   red      15      20