【问题标题】:how to break up data in column value to multiple rows in pandas dataframe如何将列值中的数据分解为熊猫数据框中的多行
【发布时间】: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


    【解决方案1】:

    试试:

    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"]))
    

    打印:

      software            name                                             business
    0      abc  Andrew Johnson            Outsourcing/Offshoring, 201-500 employees
    0      abc    Steve Martin  Health, Wellness and Fitness, 5001-10,000 employees
    1      xyz      Jack Jones                         Banking, 1001-5000 employees
    1      xyz       Rick Paul                       Construction, 51-200 employees
    1      xyz    Johnny Jones                    Consumer Goods, 10,001+ employees
    2      def          Tom D.                                          Unspecified
    2      def       Connie J.                                          Unspecified
    2      def        Ricky B.                                        Self-employed
    

    【讨论】:

    • 我已更新我的问题以包含您刚刚发布的代码,但我似乎仍然收到一条错误消息。我已在我的问题中包含错误消息以及您发布的更新解决方案。你会知道为什么我仍然遇到这个问题吗?
    • @JackJones 查看错误,似乎缺少business 列?您的 CSV 中是否有列 business(区分大小写)?
    • 是的,“业务”列确实存在,并且拼写方式完全一致。出于某种原因,我使用上面的代码加载了 csv 文件,但是当我打印 df.head() 时它返回为空。
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2017-02-12
    • 2016-12-03
    • 2021-07-27
    • 2018-12-04
    • 1970-01-01
    • 2021-05-08
    • 2023-03-21
    相关资源
    最近更新 更多