CSV - 将多行单元格拆分为多个单元格
CSV - Split multiple-line cell into multiple cells
我目前正在做一些大数据的工作。我在 .CSV 中遇到问题,我需要将多行单单元文本块拆分为单个单元格。下面的 table 显示了所需的输出。目前,所有 'ingredients' 都在同一个单元格中,每种成分都在其自己的新行中(Stack Overflow 不允许我在同一个单元格中创建新行)。
我需要编写一个脚本来将这个成分单元格拆分为以下输出,使用单元格中的每个新行作为分隔符。我使用它的实际用例要复杂得多 - 超过 200 'items',以及每个 'item' 50-150 'ingredients' 之间的任何地方。我目前在 excel 中手动执行此操作,将一系列文本添加到列中并转置粘贴,但大约需要 2-2.5 个完整的工作日才能完成。
Link 到数据
下面的代码
Item
Ingredients
Coffee
Coffee beans
Milk
Sugar
Water
import pandas as pd
df = pd.read_csv(r'd:\Python\menu.csv', delimiter=';', header=None)
headers = ["Item", "Ingredients"]
df.columns = headers
df["Ingredients"]=df["Ingredients"].str.split("\n")
df = df.explode("Ingredients").reset_index(drop=True)
df.to_csv(r"D:\Python\output.csv")
以下是如何使用 Python 的标准 csv^1 ^2 模块:
import csv
writer = csv.writer(open('output.csv', 'w', newline=''))
reader = csv.reader(open('input.csv', newline=''))
writer.writerow(next(reader)) # copy header
for row in reader:
item = row[0]
ingredients = row[1].split('\n')
first_ingredient = ingredients[0]
writer.writerow([item, first_ingredient])
for ingredient in ingredients[1:]:
writer.writerow([None, ingredient]) # None for a blank cell (under the item)
鉴于你的小样本,我明白了:
Item
Ingredients
Coffee
Coffee beans
Milk
Sugar
Water
使用您的代码和链接数据将分隔符更改为逗号,如下所示。
import pandas as pd
df = pd.read_csv('Inventory.csv', delimiter=',')
df["Software"]=df["Software"].str.split("\n")
df = df.explode("Software").reset_index(drop=True)
# Remove rows having empty string under Software column.
df = df[df['Software'].astype(bool)]
df = df.reset_index(drop=True)
df.to_csv("out_Inventory.csv")
print(df.to_string())
输出
Hostname Software
0 ServerName1 Windows Driver Package - Amazon Inc. (AWSNVMe) SCSIAdapter (08/27/2019 1.3.2.53) [version 08/27/2019 1.3.2.53]
1 ServerName1 Airlock Digital Client [version 4.7.1.0]
2 ServerName1 AppFabric 1.1 for Windows Server [version 1.1.2106.32]
3 ServerName1 BlueStripe Collector [version 8.0.3]
...
我目前正在做一些大数据的工作。我在 .CSV 中遇到问题,我需要将多行单单元文本块拆分为单个单元格。下面的 table 显示了所需的输出。目前,所有 'ingredients' 都在同一个单元格中,每种成分都在其自己的新行中(Stack Overflow 不允许我在同一个单元格中创建新行)。
我需要编写一个脚本来将这个成分单元格拆分为以下输出,使用单元格中的每个新行作为分隔符。我使用它的实际用例要复杂得多 - 超过 200 'items',以及每个 'item' 50-150 'ingredients' 之间的任何地方。我目前在 excel 中手动执行此操作,将一系列文本添加到列中并转置粘贴,但大约需要 2-2.5 个完整的工作日才能完成。
Link 到数据
下面的代码
Item | Ingredients |
---|---|
Coffee | Coffee beans |
Milk | |
Sugar | |
Water |
import pandas as pd
df = pd.read_csv(r'd:\Python\menu.csv', delimiter=';', header=None)
headers = ["Item", "Ingredients"]
df.columns = headers
df["Ingredients"]=df["Ingredients"].str.split("\n")
df = df.explode("Ingredients").reset_index(drop=True)
df.to_csv(r"D:\Python\output.csv")
以下是如何使用 Python 的标准 csv^1 ^2 模块:
import csv
writer = csv.writer(open('output.csv', 'w', newline=''))
reader = csv.reader(open('input.csv', newline=''))
writer.writerow(next(reader)) # copy header
for row in reader:
item = row[0]
ingredients = row[1].split('\n')
first_ingredient = ingredients[0]
writer.writerow([item, first_ingredient])
for ingredient in ingredients[1:]:
writer.writerow([None, ingredient]) # None for a blank cell (under the item)
鉴于你的小样本,我明白了:
Item | Ingredients |
---|---|
Coffee | Coffee beans |
Milk | |
Sugar | |
Water |
使用您的代码和链接数据将分隔符更改为逗号,如下所示。
import pandas as pd
df = pd.read_csv('Inventory.csv', delimiter=',')
df["Software"]=df["Software"].str.split("\n")
df = df.explode("Software").reset_index(drop=True)
# Remove rows having empty string under Software column.
df = df[df['Software'].astype(bool)]
df = df.reset_index(drop=True)
df.to_csv("out_Inventory.csv")
print(df.to_string())
输出
Hostname Software
0 ServerName1 Windows Driver Package - Amazon Inc. (AWSNVMe) SCSIAdapter (08/27/2019 1.3.2.53) [version 08/27/2019 1.3.2.53]
1 ServerName1 Airlock Digital Client [version 4.7.1.0]
2 ServerName1 AppFabric 1.1 for Windows Server [version 1.1.2106.32]
3 ServerName1 BlueStripe Collector [version 8.0.3]
...