[英]Modifying an unstructured pandas dataframe into a new structured dataframe
我有一个像下面这样的 df,我想将它转换为新的 DataFrame
# column_1 column_2 column_3 column_4
# ticket 12345
# Date 2020-02-01
# UPC Code Description Qty Unit Price
# 987654 product 1 1 10
# 879756 product 2 1 7
# 987895 product 3 2 5
# ticket 12346
# Date 2020-02-03
# UPC Code Description Qty Unit Price
# 987654 product 1 1 10
# 997651 product 4 1 3
# ticket 12347
这是新 dataframe 的示例:
# ticket date upc_code description qty unit_price
# 12345 2020-02-01 987654 product 1 1 10
# 12345 2020-02-01 879756 product 2 1 7
# 12345 2020-02-01 987895 product 3 2 5
# 12346 2020-02-03 987654 product 1 1 10
# 12346 2020-02-03 997651 product 4 1 3
# 12347
有人可以帮我吗? 我试图弄清楚如何做到这一点。 每个票值都是一个采购订单,票和日期值应根据每个订单上的产品重复。 Upc 代码下方的行会根据购买的商品数量而变化。
先感谢您!
IIUC,您需要过滤空白行和字符串,然后在进行一些旋转后重新连接。
如果您的空格不是真正的 null 值,您可以使用以下代码行转换它们。
import numpy as np
df = df.replace('',np.nan,regex=True)
print(df)
column_1 column_2 column_3 column_4
0 ticket 12345 NaN NaN
1 Date 2020-02-01 NaN NaN
2 UPC Code Description Qty Unit Price
3 987654 product 1 1 10
4 879756 product 2 1 7
5 987895 product 3 2 5
6 ticket 12346 NaN NaN
7 Date 2020-02-03 NaN NaN
8 UPC Code Description Qty Unit Price
9 987654 product 1 1 10
10 997651 product 4 1 3
11 ticket 12347 NaN NaN
s = df.dropna(how='any').loc[~df["column_1"].str.contains("UPC Code")]
s1 = df[~df.index.isin(s.index) & ~df["column_1"].str.contains("UPC Code")]
df2 = pd.concat(
[
pd.crosstab(s1.index, s1["column_1"], s1["column_2"], aggfunc="first")
.ffill()
.bfill()
.reset_index(drop=True),
s.reset_index(drop=True),
],
axis=1,
)
print(df2)
Date ticket column_1 column_2 column_3 column_4
0 2020-02-01 12345 987654 product 1 1 10
1 2020-02-01 12345 879756 product 2 1 7
2 2020-02-01 12346 987895 product 3 2 5
3 2020-02-03 12346 987654 product 1 1 10
4 2020-02-03 12347 997651 product 4 1 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.