【问题标题】:CSV - Split multiple-line cell into multiple cellsCSV - 将多行单元格拆分为多个单元格
【发布时间】:2022-01-20 23:19:23
【问题描述】:

我目前正在做一些大数据工作。我在 .CSV 中有一个问题,我需要将多行单单元文本块拆分为单个单元格。下表显示了所需的输出。目前,所有“成分”都在同一个单元格中,每种成分都在自己的新行中(Stack Overflow 不允许我在同一个单元格中创建新行)。

我需要编写一个脚本来将这个成分单元格拆分为下面的输出,使用单元格中的每个新行作为分隔符。我使用它的实际用例要复杂得多——超过 200 个“项目”,每个“项目”有 50-150 个“成分”。我目前正在 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")

【问题讨论】:

  • 您能否以文本形式显示您的数据?这张桌子很难跟上。
  • 已编辑 - 链接到有问题的 .csv 文件。我需要将 .csv 中的每个软件项拆分为单独的单元格,但不知道该怎么做。

标签: python pandas dataframe csv split


【解决方案1】:

使用您的代码和链接数据将分隔符更改为逗号,如下所示。

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]
...

【讨论】:

    【解决方案2】:

    下面是如何使用 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

    【讨论】:

    • 你是神...
    • 有没有办法让我指定“成分”写入哪一列?为简单起见,我删除了 .csv 中的其他一些列,但它们在脚本中运行良好。目前,“成分”正在写入第 2 列,但我需要它们写入第 4 列。
    • @CunnyFunt,是的,将row[1] 更改为row[3],还有两个None 用于“填充”新行...writerow([None, None, None, ingredient])
    • 给自己买瓶啤酒@Zach Young
    • @CunnyFunt,我会这样做,谢谢。我真的希望您了解读取和写入行的工作原理......使用 CSV 是一件非常基础的事情。我也很好奇我的指南(第二个链接)是否有帮助。干杯! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多