【问题标题】:Python pandas - can I sort 1 column dataset into rows of matching data in another datasetPython pandas - 我可以将 1 列数据集排序为另一个数据集中的匹配数据行吗
【发布时间】:2022-06-13 01:40:50
【问题描述】:

我已经写了一半代码,但在第二半时卡住了。

我已从文本文档中提取信息,并将信息放入 pandas 数据集列,其中包含类似的数据

Job : one
Time :17:00
Date : Tuesday
Cost:200
Job:Two
Time :18:00
Location :England
Job :Three
Time :12:00
Date :Monday
Location :England
Cost:1200

我已将所有独特的类别提取到另一个数据集中并将它们放入列中

Job|Time|Date|Location|Cost

现在我想循环浏览第一个数据集并将每行的每个新作业填写到相关列中,很高兴没有数据的列是空白的...

Job|Time|Date|Location|Cost
One|17:00|Tuesday|    |200
Two|18:00|       |England|
Three|12:00|Monday|England|1200

这是一个例子。我实际上有 33 个独特的类别。

我不知道如何开始编写这部分代码(或者如果可能的话)。脚本新手,很高兴能走到这一步..

我使用 pandas 将信息放入表格有助于我的大脑,因为我从文本文档中提取信息,而 python 喜欢将其全部压缩,但不确定使用 pandas 是否会限制我的选择。

感谢任何帮助/提示

不确定是否有帮助,但到目前为止我的代码

【问题讨论】:

  • 非常感谢您提供以下选项。我会试一试,让你知道我是怎么过的。非常感谢您的时间。

标签: python pandas


【解决方案1】:

您可以通过; 的第一次出现将data 列拆分为两列,并通过Job 分隔符进行分组,然后转置每个组。

df[['key', 'val']] = df['data'].str.split(':', 1, expand=True).apply(lambda x: x.str.strip())

m = (df['key'] == 'Job').cumsum()

df_ = df[['key', 'val']].groupby(m).apply(lambda group: group.set_index('key').T).reset_index(drop=True)
print(df_)

key    Job   Time     Date  Cost Location
0      one  17:00  Tuesday   200      NaN
1      Two  18:00      NaN   NaN  England
2    Three  12:00   Monday  1200  England

【讨论】:

  • 哇,这工作得很好,我有 11000 行和 34 列,而且工作得很好。非常感谢
  • @Demo 如果您的问题得到解决,请接受最佳解决方案表示感谢满足您的需求接受检查位于答案左上角的向上/向下箭头下方。如果出现更好的解决方案,则可以接受新的解决方案。如果您的声誉为 15 或更高,您还可以使用向上或向下箭头对答案的质量进行投票。 如果解决方案不能回答问题,请发表评论What should I do when someone answers my question?。谢谢。
【解决方案2】:

您可以split,使用cumsumpivot 计算索引。

(df['col']
 .str.split(r'\s*\:\s*', n=1, expand=True)
 .assign(index=lambda d: d[0].eq('Job').cumsum())
 .pivot('index', 0, 1)
 # lines below are optional
 .reset_index(drop=True)
 .rename_axis(columns=None)
 .reindex(columns=['Job','Time','Date','Location','Cost'])
 )

输出:

     Job   Time     Date Location  Cost
0    one  17:00  Tuesday      NaN   200
1    Two  18:00      NaN  England   NaN
2  Three  12:00   Monday  England  1200

其他(可选)代码行只是为了清理输出(轴名称、索引、列顺序...)。我使用reindex 对列重新排序以防止在缺少标签时出现错误,但如果您确定名称存在,则可以使用简单的切片:[['Job','Time','Date','Location','Cost']]

【讨论】:

  • 嗨,谢谢。我选择了另一个选项,只是因为我不确定是否必须命名列,或者是否可以在数据框中给出一个范围
  • 我不明白你的担忧。您不需要命名任何东西,只需运行代码并将其分配给输出变量;)如果您正在考虑 rename_axis/reindex/... 这不是那么重要(主要是装饰性的),请尝试使用和不使用看看有什么不同。
【解决方案3】:

谢谢你- 我从 Ynjxsjmh 中选择了这个选项

df[['key', 'val']] = df['data'].str.split(':', 1, expand=True).apply(lambda x: x.str.strip() )

m = (df['key'] == 'Job').cumsum()

df_ = df[['key', 'val']].groupby(m).apply(lambda group: group.set_index('key').T).reset_index(drop=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2022-11-15
    • 2021-12-24
    相关资源
    最近更新 更多