【问题标题】:Simple Column split in PandasPandas 中的简单列拆分
【发布时间】:2014-01-12 22:21:23
【问题描述】:

我在 CSV 中有这样的内容:

 phone                            name     area
 (444) 444-4444, (000) 000-0000   Foo      cityname, ST
 (555) 555-5555                   Bar      othercity, SN

我如何最简单地得出这个结论:

 phone            name     area       State
 (444) 444-4444   Foo      cityname   ST
 (555) 555-5555   Bar      othercity  SN

这是两个基本拆分 - 首先,我想从 ['phone'] 中删除第一个索引之后的所有内容,但在第二个中,我想将 ['area'] 中逗号之后的所有内容添加到['State'] - 我认为学习这两种方法会很棒。

在实际文件中,CSV 用逗号分隔,字段使用引号:它是标准 csv。我使用空白表来显示问题。

【问题讨论】:

  • 这是一个棘手的解析任务,而且这 [似乎] 不是 csv。您的文件或手机中必须有标签,名称和区域值必须对齐,才能在一般情况下正确解析它。
  • 如果您指出文件中的哪些条目由空格分隔,哪些由制表符分隔,我认为这个问题会更清楚,也许每个制表符使用\t

标签: python python-2.7 csv pandas dataframe


【解决方案1】:
import pandas as pd
#df = pd.read_csv('file.csv', dtype={'area': str, 'phone': str})
df=pd.DataFrame(columns=['phone','name','area'],
                data=[['(444) 444-4444, (000) 000-0000', 'Foo', 'cityname, ST'],
                      ['(555) 555-5555',   'Bar', 'othercity, SN']])
print df
df['State'] = df.area.apply(lambda x: x.split(',')[1] if len(x.split(','))>1 else '')
df.area = df.area.apply(lambda x: x.split(',')[0])
df.phone = df.phone.apply(lambda x: x.split(',')[0])
print df

输出:

                            phone name           area
0  (444) 444-4444, (000) 000-0000  Foo   cityname, ST
1                  (555) 555-5555  Bar  othercity, SN
            phone name       area State
0  (444) 444-4444  Foo   cityname    ST
1  (555) 555-5555  Bar  othercity    SN

【讨论】:

  • 使用 [1] 我的列表索引超出范围。使用 [0] 我得到 float 对象没有属性拆分(这是一个大文件,但我不知道为什么该列中的任何内容都会具有 float 属性)。
  • 我得到一个列表索引超出范围错误。我认为这是某些区域条目没有逗号和州名的结果。在这种情况下,我该如何避免错误?
  • 奇怪的是,我有一个案例,即使我在该列上使用了 dtype = np.object,但我得到“AttributeError:'float' object has no attribute 'split'”,并且 dtype 由打印(mytable.dtypes)。当单元格有零长度字符串时,它会报告 print(type(cell)) => 并且单元格值为 NaN。
猜你喜欢
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2023-01-27
  • 2020-12-16
  • 1970-01-01
  • 2018-04-07
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多