【问题标题】:Pandas python help - can't seem to get the code to do what I need it toPandas python 帮助 - 似乎无法获得代码来做我需要的事情
【发布时间】:2020-11-18 03:43:07
【问题描述】:

我必须编写一个脚本来读取 csv 文件并删除带有 '.' 的列并将字符串 False 和 True 读取为 0 和 1。我已经能够很好地对 drop 列进行编码,但是我无法让 pandas 将 False 读取为 0 并将 True 读取为 1,以便可以以数字形式查看整个数据.所有其他数据都是浮动的,所以我相信我必须迭代以找到 False 和 True 并将其读取为 0 和 1。下面是我到目前为止的代码,我附上了一个示例数据

import numpy as np
import pandas as pd

[![enter image description here][1]][1]

def ImportCustomScript(filename):

    data = pd.read_csv(filename, sep=',', header=None)
    cols = data.shape[1]
    data_list=[]
    
    for i in range(cols):
        if i=='.' in data.columns:
           data.drop([i], axis=1)

    data_list.append([data[i][0], np.array(data[cols][1:], dtype='<f8')])
    data.replace('False',0).replace('True',1)

    data_frame = pd.DataFrame(data_list)
    return data_frame

【问题讨论】:

  • 嗨 NewbieCoder,欢迎来到 SO。使问题可重现是一种很好的做法,因此,如果您可以包含实际文件,或者更好的是,生成一个非常小的数据框来重现您遇到的问题,这将增加您获得有用答案的机会。
  • @zabop 原始 csv 文件有 30k 行和 334 列。不确定如何在此处添加该文件。第一行是标签,下面的所有其他内容都是浮点数,有些数据说 False,有些说 True 而不是浮点数。如果您对如何添加文件或部分图像有任何建议,我将不胜感激。谢谢。
  • 嗨新手编码员!那么你能举一个你的数据框正在读取的 1 或 2 行数据的例子吗?因为我不确定读入字符串“False”/“True”是什么意思。字符串是否只包含这些单词中的任何一个?或者它是否涉及其他单词/字符?
  • Pandas 不会使用数据中的 True 和 False 词读取 csv 文件,而是将其读取为 0 和 1。我澄清得更好了吗?

标签: python python-3.x pandas pycharm pandas-datareader


【解决方案1】:

也许可以这样做,尽管有关您的实际数据的更多信息会很有用

print(df)

     col   col2   col3.
0   True      5       6
1  False      6       3
2   True     32       5
3  False      3       9

df = df[df.columns[~df.columns.str.contains('\.')]]
df['col'] = df['col'].astype(int) #or df.loc[:,'col'] = df['col'].astype(int)

【讨论】:

  • 实际的 csv 文件包含超过 30k 行和 334 列。所以我不能使用特定的列标签
  • 然后在第二部分使用替换
  • 或者制作 bool 列的掩码以制作 int
  • 我第一次使用 data = data.replace('False',0).replace('True',1) 但这也不起作用。我认为可能是我对 Pandas 的语法错误?
【解决方案2】:

实现这两项任务的最佳方法是根据您想要的属性屏蔽列。

对于第一部分,假设 data 是您的 DataFrame,您可以屏蔽(使用 ~)包含点的列:

data = data[~data.columns.str.contains("\.")]

对于第二部分,由于pd.read_csv 已经识别布尔列,您可以使用pd.DataFrame.astype 仅将布尔列转换为int

data = data.astype({col: int for col in data.columns[data.dtypes == bool]})

编辑

如果由于某种原因pd.read_csv 没有自动将"True""False" 字符串转换为布尔值,您可以使用以下解决方案首先识别仅包含这些字符串的列,然后将它们替换为您的整数代码:

for col in data.columns[data.dtypes == object]:
    if data[col].str.match("^True|False$").all():
        data[col].replace({"True": 1, "False": 0}, inplace=True)

编辑 2

根据您最近附加的图像,字符串"True""False" 与其他值混合在一起。相反,我之前的回答是指列的所有值都由这些字符串组成的情况。

因此,要达到您想要的结果,您可以按如下方式替换所有值:

def ImportCustomScript(filename):
    # read the csv
    df = pd.read_csv(filename, sep=',')

    # remove the columns whose name contains a dot
    df = df[~df.columns.str.contains("\.")]

    # replace all "True"/"False" strings
    df.replace({"True": 1, "False": 0}, inplace=True)

    # if you want to convert everything to float
    df = df.astype(float)

    return df

【讨论】:

  • @NewbieCoder,我根据您附上的图片更新了答案。它解决了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2021-09-05
  • 2020-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
相关资源
最近更新 更多