【问题标题】:Pandas read csv where one header is missingPandas 读取缺少一个标头的 csv
【发布时间】:2021-02-03 04:29:24
【问题描述】:

我正在尝试使用 Pandas 读取 csv 文件,但第一列包含用逗号分隔的名字和姓氏。这导致 Pandas 认为有 5 列而不是 4 列,因此最后一列现在没有标题,因此无法选择。

文件如下所示:

CustomerName,ClientID,EmailDate,EmailAddress
FNAME1,LNAME1,100,2019-01-13 00:00:00.000,FNAME1@HOTMAIL.COM
FNAME2,LNAME2,100,2019-01-13 00:00:00.000,FNAME2@GMAIL.COM
FNAME3,LNAME3,100,2019-01-13 00:00:00.000,FNAME3@AOL.COM
FNAME4,LNAME4,100,2019-01-13 00:00:00.000,FNAME40@GMAIL.COM
FNAME5,LNAME5,100,2019-01-13 00:00:00.000,FNAME5@AOL.COM

我的代码现在的样子:

def convert_ftp_data():
    file = os.getcwd() + "/data.csv"
    data = pd.read_csv(file, index_col=False)

data["first_name"] = data["CustomerName"].str.split().str[0].str.title()
data["email"] = data["EmailAddress"]

clean_data = data.drop(data[["CustomerName", "ClientID", "EmailDate", "EmailAddress"]], 1)

print(clean_data)

使用我的代码,我得到以下输出:

first_name  email
0   FNAME1  2019-01-13 00:00:00.000
1   FNAME1  2019-01-13 00:00:00.000
2   FNAME1  2019-01-13 00:00:00.000
3   FNAME1  2019-01-13 00:00:00.000
4   FNAME1  2019-01-13 00:00:00.000

我只需要选择 FNAME 和 EmailAddress 字段。最好的方法是什么?

【问题讨论】:

  • .iloc 也许?
  • df.loc[:, ['first_name','EmailAddress']] 或更精确地使用切片!
  • 带逗号的数据要用双引号括起来"FNAME1,LNAME1"
  • @DavidLemon 不幸的是,我无法控制数据的发送方式
  • @user5173426 你能详细说明一下吗?试图了解如何解决这个问题,这样我就不会再遇到这个了

标签: python pandas csv dataframe


【解决方案1】:

单独阅读标题

使用pd.read_csv,您可以使用nrowsskiprowsnames 参数:

from io import StringIO

x = """CustomerName,ClientID,EmailDate,EmailAddress
FNAME1,LNAME1,100,2019-01-13 00:00:00.000,FNAME1@HOTMAIL.COM
FNAME2,LNAME2,100,2019-01-13 00:00:00.000,FNAME2@GMAIL.COM
FNAME3,LNAME3,100,2019-01-13 00:00:00.000,FNAME3@AOL.COM
FNAME4,LNAME4,100,2019-01-13 00:00:00.000,FNAME40@GMAIL.COM
FNAME5,LNAME5,100,2019-01-13 00:00:00.000,FNAME5@AOL.COM"""

headers = pd.read_csv(StringIO(x), nrows=0).columns
headers = np.hstack((['FirstName', 'LastName'], headers[1:]))

df = pd.read_csv(StringIO(x), header=None, skiprows=[0], names=headers)

print(df)

#   FirstName LastName  ClientID                EmailDate        EmailAddress
# 0    FNAME1   LNAME1       100  2019-01-13 00:00:00.000  FNAME1@HOTMAIL.COM
# 1    FNAME2   LNAME2       100  2019-01-13 00:00:00.000    FNAME2@GMAIL.COM
# 2    FNAME3   LNAME3       100  2019-01-13 00:00:00.000      FNAME3@AOL.COM
# 3    FNAME4   LNAME4       100  2019-01-13 00:00:00.000   FNAME40@GMAIL.COM
# 4    FNAME5   LNAME5       100  2019-01-13 00:00:00.000      FNAME5@AOL.COM

【讨论】:

    【解决方案2】:

    为什么不跳过标题并在导入后正确设置

    data = pd.read_csv(file, index_col=False, header=None, skiprows=1)
    
    data.columns = 'CustomerFirstName,CustomerName,ClientID,EmailDate,EmailAddress'.split(',')
    

    【讨论】:

    • 这给出了以下错误:ValueError: Length mismatch: Expected axis has 4 elements, new values have 5 elements
    • 解决了!谢谢!
    【解决方案3】:

    尝试以下方法:

    pd.read_csv(file, usecols=['EmailAddress']).reset_index().rename(columns={'index': 'first_name', 'EmailAddress': 'email'})
    

    输出:

        first_name  email
    0   FNAME1      FNAME1@HOTMAIL.COM
    1   FNAME2      FNAME2@GMAIL.COM
    2   FNAME3      FNAME3@AOL.COM
    3   FNAME4      FNAME40@GMAIL.COM
    4   FNAME5      FNAME5@AOL.COM
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2018-08-28
      • 2013-12-12
      相关资源
      最近更新 更多