如何在 Python 中使用管道分隔符拆分文本文件,然后使列数等于属性值的数量?

Posted

技术标签:

【中文标题】如何在 Python 中使用管道分隔符拆分文本文件,然后使列数等于属性值的数量?【英文标题】:How to split text file with Pipe delimiter in Python and then have number of columns equal to number of attribute values? 【发布时间】:2021-12-29 08:57:29 【问题描述】:

我有一个带有“|”的文本文件,如下所示分隔符,属性的值的数量可以是任意的。需要基于等于属性值数量的新列。

Attribute1|6
Attribute2|10|15|27
Attribute3|3|7

DataFrame 中要求的输出应该是:

Attribute1         6
Attribute2_val_1  10
Attribute2_val_2  15
Attribute3_val_3  27
Attribute3_val_1   3
Attribute3_val_2   7

【问题讨论】:

是否有最大列数?实际数据预期的行数是多少? 另外,Name 是标题还是行? 嗨@mozway。最终数据框中的最大列数为两。 “姓名”也是另一个属性 我说的是输入。你能有20列吗? 100? 10000?上限是多少? @mozway 输入最多有 10 列 【参考方案1】:

您可以使用以下内容:

MAX_COL = 10
df = (pd.read_csv('filename.txt', sep=r'\|', names=range(MAX_COL+1))
        .dropna(how='all', axis=1)
        .set_index(0).rename_axis('id').stack()
        .reset_index(name='value')
        .assign(id=lambda d: (d['id'].where(d.groupby('id')['id'].transform('size').le(1),
                                            d['id']+'_val_'+d['level_1'].astype(str))
                             )
               )
        .drop(columns=['level_1'])
      )

输出:

>>> df
                 id  value
0        Attribute1    6.0
1  Attribute2_val_1   10.0
2  Attribute2_val_2   15.0
3  Attribute2_val_3   27.0
4  Attribute3_val_1    3.0
5  Attribute3_val_2    7.0

替代方案:

with open('filename.txt') as f:
    df = pd.DataFrame([[s[0], s[1:]] for s in
                        map(lambda s: s.strip().split('|'), f.readlines())],
                      columns=['id', 'value']
                     )

df = (df.explode('value')
        .assign(id=lambda d: (d['id'].where(d.groupby('id')['id'].transform('size').le(1),
                                            d['id']+'_val_'+d.groupby('id')['id'].cumcount().add(1).astype(str))
                             )
               )
      )

输出:

                 id value
0        Attribute1     6
1  Attribute2_val_1    10
1  Attribute2_val_2    15
1  Attribute2_val_3    27
2  Attribute3_val_1     3
2  Attribute3_val_2     7

【讨论】:

成功了。谢谢:)

以上是关于如何在 Python 中使用管道分隔符拆分文本文件,然后使列数等于属性值的数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数

基于SQL Server中的分隔符将文本拆分为多列

Python 拆分文本

文本文件字符串拆分然后将每个元素输出到视图表中

如何使用管道分隔符导出到 .csv

如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符