【发布时间】:2021-10-12 09:09:34
【问题描述】:
我有一个问题,我的 csv 文件中有多个行,必须转换为 pandas 数据框,但是有些行的“名称”和“业务”列有多个名称和业务应该在单独的行,需要拆分,同时保持其他列的数据对于拆分的每一行都相同。
这是示例数据:
输入:
| software | name | business |
|---|---|---|
| abc | Andrew Johnson, Steve Martin | Outsourcing/Offshoring, 201-500 employees,Health, Wellness and Fitness, 5001-10,000 employees |
| xyz | Jack Jones, Rick Paul, Johnny Jones | Banking, 1001-5000 employees,Construction, 51-200 employees,Consumer Goods, 10,001+ employees |
| def | Tom D., Connie J., Ricky B. | Unspecified, Unspecified, Self-employed |
我需要的输出:
| software | name | business |
|---|---|---|
| abc | Andrew Johnson | Outsourcing/Offshoring, 201-500 employees |
| abc | Steve Martin | Health, Wellness and Fitness, 5001-10,000 employees |
| xyz | Jack Jones | Banking, 1001-5000 employees |
| xyz | Rick Paul | Construction, 51-200 employees |
| xyz | Johnny Jones | Consumer Goods, 10,001+ employees |
| def | Tom D | Unspecified |
| def | Connie J | Unspecified |
| def | Ricky B | Self-employed |
还有类似于“name”和“business”的附加列,其中包含需要拆分的多条信息,就像“name”和“business”一样。包含多条信息的单元格按顺序排列(有序)。
这是我目前拥有的代码并创建了新行,但它只拆分了 name 列中的内容,但是留下了 business 列和剩下的一些其他列需要与来自名称列。
name2 = df.name.str.split(',', expand=True).stack()
df = df.join(pd.Series(index=name2.index.droplevel(1), data=name2.values, name = 'name2'))
dict = df.to_dict('record')
for row in dict:
new_segment = {}
new_segment['name'] = str(row['name2'])
#df['name'] = str(row['name2'])
for col,content in new_segment.items():
row[col] = content
df = pd.DataFrame.from_dict(dict)
df = df.drop('name2', 1)
这是我也在尝试的另一种解决方案,但它也给了我一个错误:
review_path = r'data/base_data'
review_files = glob.glob(review_path + "/test_data.csv")
review_df_list = []
for review_file in review_files:
df = pd.read_csv(io.StringIO(review_file), sep = '\t')
print(df.head())
df["business"] = (df["business"].str.extractall(r"(?:[\s,]*)(.*?(?:Unspecified|employees|Self-employed))").groupby(level=0).agg(list))
df["name"] = df["name"].str.split(r"\s*,\s*")
print(df.explode(["name", "business"]))
outPutPath = Path('data/base_data/test_data.csv')
df.to_csv(outPutPath, index=False)
替代解决方案的错误消息:
读取:data/base_data/review_base.csv
成功了!
空数据框
列:[data/base_data/test_data.csv]
索引:[]
【问题讨论】:
标签: python python-3.x pandas dataframe