【问题标题】:How to properly delete a column in dataframe (pandas)?如何正确删除数据框(熊猫)中的列?
【发布时间】:2019-06-28 17:31:00
【问题描述】:

我无法使用 pandas 从csv 中删除列。我尝试使用不同的轴、del 函数以多种方式删除它,但它不起作用。有人知道为什么吗?

这是我的 pandas.head()

年龄;“工作”;“婚姻”;“教育”;“默认”;“余额”;“住房”;“贷款”;“联系人”;“日”;“月”;“持续时间”;”活动";"pdays";"以前的";"poutcome";"y"
0 58;“管理”;“已婚”;“大专”;“没有”;2143...
1 44;“技师”;“单身”;“中学”;“无”;29;“...
2 33;“企业家”;“已婚”;“中学”;“没有”;2...
3 47;“蓝领”;“已婚”;“未知”;“否”;1506...
4 33;“未知”;“单个”;“未知”;“否”;1;“否”;“n...

这是我的代码:

import pandas  
df = pd.read_csv('bank-full.csv')
print(df.head())
df = df.drop(['day', 'poutcome'], axis=1)

这是错误:

Traceback(最近一次调用最后一次):
  文件“/home/administrator/PycharmProjects/BankMarketinData/main.py”,第 21 行,在
    主要的()
  文件“/home/administrator/PycharmProjects/BankMarketinData/main.py”,第 19 行,在 main
    df = df.drop(['day', 'poutcome'], axis=1)
  文件“/home/administrator/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py”,第 3697 行,放入
    错误=错误)
  文件“/home/administrator/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py”,第 3111 行,在 drop
    obj = obj._drop_axis(标签,轴,级别=级别,错误=错误)
  _drop_axis 中的文件“/home/administrator/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py”,第 3143 行
    new_axis = axis.drop(标签,错误=错误)
  文件“/home/administrator/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py”,第 4404 行,放入
    '{} 在轴中找不到'.format(labels[mask]))
KeyError: "['day' 'poutcome'] 在轴上找不到"

【问题讨论】:

  • 我认为您的列标题中有引号。试试df.columns = df.columns.str.strip('\"')
  • 请显示 df.head().to_dict() 也许你有空格?
  • 在下面发布答案。在示例数据帧上对其进行了测试
  • 我的猜测是你的列标签被引用了,例如,"day"

标签: python pandas csv delimiter


【解决方案1】:
df = pd.read_csv('bank-full.csv', sep=';')
df.columns = [col.replace('"', '') for col in df.columns]
df.drop(columns=['day','poutcome'], inplace=True)

从后续 cmets 中可以看出,您的问题是在导入 csv 文件时使用了错误的分隔符。然后,您需要删除列名中的引号,以便删除这些列。

【讨论】:

  • 您需要从列名中删除引号。在 csv 或 python 中,它都可以工作。
  • 打印列名并确保它们是您所期望的。
  • 指数(['年龄;“工作”;“婚姻”;“教育”;“默认”;“余额”;“住房”;“贷款”;“联系人”;“天”; “月”;“持续时间”;“活动”;“pdays”;“上一个”;“poutcome”;“y”'],dtype='object')索引(['年龄;工作;婚姻;教育;默认;余额;住房;贷款;联系人;日;月;持续时间;活动;pdays;previous;poutcome;y'], dtype='object') 和之前评论中的错误
  • 它正在阅读您所有的专栏,就像它看起来一样。我会更新上面的代码。
  • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
【解决方案2】:

您可以一一删除它们,或使用循环删除多列。您确实需要确保这些列名是数据框中的列名。从您的问题看来,您的列名包含在“”中。确保在读取数据帧时也正确定义分隔符。使用 read_csv 时,它将默认为 ',',但在这种情况下它是 ';'。

一个接一个

df = pd.read_csv('bank-full.csv', sep=';')
df = df.drop(['day'], axis=1)
df = df.drop(['poutcome'], axis=1)

循环

df = pd.read_csv('bank-full.csv', sep=';')
Drop_list = ['day','poutcome']
for column in Drop_list: 
    df = df.drop([column], axis=1)

我用于问题的测试:

df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD'))
df.head(5)

              A         B         C         D
    0  0.860680 -0.408577  0.727530 -0.119050
    1 -1.140042  0.241970 -1.509257 -0.303601
    2  0.811929  0.146228  2.102941  0.772328
    3 -0.590157  0.753719  0.220592 -0.563953
    4  0.031505 -0.521978  0.410718 -0.325865

Drop_list = ['A','B','C']
for column in Drop_list:
    df = df.drop([column], axis=1)
df.head(5)

          D
0 -0.119050
1 -0.303601
2  0.772328
3 -0.563953
4 -0.325865

【讨论】:

  • 他的问题是他的列名中有引号
  • 这个,你使用的测试代码对我有用,但在我的 csv 文件上它不起作用
  • 使用 pd.read_csv 时的分隔符是什么?当您读取正在使用的数据帧时,df = pd.read_csv('bank-full.csv', sep=';')。看起来您没有正确定义标题行。
  • 你是对的,添加 sep=';' 后,它可以工作了,谢谢你的帮助:)
【解决方案3】:

所以这是一个非常简单的问题。首先,我建议您在处理tabular 数据时使用delimiter。现在让我们专注于您的问题,因此您正在阅读您的dataframe,如下所示:

import pandas as pd  
df = pd.read_csv('bank-full.csv')
df = df.drop(['day', 'poutcome'], axis=1)

现在您的column 名称中包含""。所以你的列的名字是"day" & "poutcome" 而不是day & poutcome。请记住,这些 double quotes "" 是您的列名的一部分。所以你应该写这样的东西来删除这些列:

df = df.drop(['"day"', '"poutcome"'], axis=1)

我希望这对你有帮助。如果您还有其他问题,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多