【问题标题】:How to ignore empty columns in a dataframe?(Pandas)如何忽略数据框中的空列?(熊猫)
【发布时间】:2021-02-12 09:58:55
【问题描述】:

我想忽略数据框中的空列。

例如:

样本.csv

Id  Name  Address    Contact   Item   Rate Qty  Price
1   Mark  California 98429102  Shirt  57    2    8
2   Andre Michigan   92010211

我试过了:

import pandas as pd
df = pd.read_csv('sample.csv')
df = df.fillna('')

df.to_csv('sample.txt',sep='*',index=False, header=False)

sample.txt 的样子

1*Mark*California*98429102*Shirt*57*2*8
2*Andre*Michigan*92010211****

我想删除这里的空列。 sample.txt 应该如下所示:

1*Mark*California*98429102*Shirt*57*2*8
2*Andre*Michigan*92010211

【问题讨论】:

  • 你为什么要这样做?
  • 输出文件的格式是这样的。
  • 这看起来像是一个错误指定的格式。我不认为熊猫会在这里帮助你。您可能需要直接对文本文件进行一些后期处理。
  • 您最多可以将数据帧分成 2 份(使用像 df['item'].isna() 这样的布尔掩码)并编写 2 个单独的 CSV 文件。
  • 我需要在单个txt文件中指定所有数据

标签: python python-3.x pandas dataframe numpy


【解决方案1】:

只需使用内存缓冲区和strip()

import io
df = pd.read_csv(io.StringIO("""1*Mark*California*98429102*Shirt*57*2*8
2*Andre*Michigan*92010211****"""), sep="*", header=None)

with open("sample.csv", "w") as f: 
    f.write("\n".join([l.strip("*") for l in df.to_csv(sep="*",header=None, index=None).split("\n")]))

with open("sample.csv") as f: print(f.read())

输出

1*Mark*California*98429102*Shirt*57.0*2.0*8.0
2*Andre*Michigan*92010211

【讨论】:

    【解决方案2】:

    怎么样

    sep = '*'
    (
        df
        .applymap(str)
        .apply(
            # Removes all empty fields
            # axis=1, func=lambda s: sep.join(el for el in s if el)
            # Removes trailing fields
            axis=1, func=lambda s: sep.join(s).strip('*')
        )
        .to_csv('sample.txt', index=False, header=False)
    )
    

    【讨论】:

    • 这会从所有字段中删除空元素。我只想删除尾随字段。
    • @Atom 确实。见更新。比较轻微。有什么问题吗?
    • 好的@Jaroslav。只要它源自K&R's style (or 1TBS),我就可以接受。
    猜你喜欢
    • 2017-05-04
    • 2022-10-14
    • 2015-07-30
    • 2020-09-05
    • 2021-10-13
    • 2017-09-14
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多