目前从文件中解析出的数据聚合:
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。这样,我不必知道可能存在的所有不同颜色。
答案 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