【问题标题】:Pandas: Remove the first and last element from values in columns in a df熊猫:从df中的列中的值中删除第一个和最后一个元素
【发布时间】:2016-03-25 11:21:48
【问题描述】:

更新的解决方案:

我有 '|' 分隔某些列的数据,即它不是严格意义上的 csv。我已将其作为 csv 导入,并试图去除特定列中额外的 '|' 值。我的数据如下:

    import pandas as pd
from io import StringIO



dfy = pd.read_csv('Thesis/CRSP/CampaignFin14/pacs14.txt', header=0)

#Replace '|' in cells with series.str methods
for col in dfy:
    if dfy[col].dtype == 'object':
        dfy[col] = dfy[col].str.replace('|', '')

        dfy.head()



  |2014|  |4111920141231643319|  |C00206136|  |N00029285|  1000  05/15/2014  \
0   2014  |4021120141205164809|  |C00307397|  |N00026722|  5000  10/22/2013   
1   2014  |4053020141213944220|  |C00009985|  |N00030676|     4  03/26/2014   
2   2014  |4063020141216281752|  |C00104299|  |N00032088|  1000  05/06/2014   
3   2014  |4061920141215566782|  |C00164145|  |N00034277|  2500  05/22/2014   
4   2014  |4102420141226480432|  |C00439216|  |N00036023|  1000  09/29/2014   

由于某种原因,循环没有取出|

以下工作,但我想一次完成所有列。

dfy['cycle'] = \
dfy['cycle'].map(lambda x: str(x)[:-1])
dfy.head()

    cycle   cid     amount  date    realcode    type    di  feccandid
0   |2014   |N00029285|     1000    05/15/2014  |E1600|     |24K|   |D|     |H8TX22107|
1   |2014   |N00026722|     5000    10/22/2013  |G4600|     |24K|   |D|     |H4TX28046|
2   |2014   |N00030676|     4   03/26/2014  |C2100|     |24Z|   |D|     |H0MO07113|

这是我使用.csvsep= 导入数据时的样子。

    cycle   cid     amount  date    realcode    type    di  feccandid
0   |2014|  |N00029285|     1000    05/15/2014  |E1600|     |24K|   |D|     |H8TX22107|
1   |2014|  |N00026722|     5000    10/22/2013  |G4600|     |24K|   |D|     |H4TX28046|
2   |2014|  |N00030676|     4   03/26/2014  |C2100|     |24Z|   |D|     |H0MO07113|

这是.txt中的样子:

|2014|,|4111920141231643319|,|C00206136|,|N00029285|,1000,05/15/2014,|E1600|,|24K|,|D|,|H8TX22107|
|2014|,|4021120141205164809|,|C00307397|,|N00026722|,5000,10/22/2013,|G4600|,|24K|,|D|,|H4TX28046|
|2014|,|4053020141213944220|,|C00009985|,|N00030676|,4,03/26/2014,|C2100|,|24Z|,|D|,|H0MO07113|
|2014|,|4063020141216281752|,|C00104299|,|N00032088|,1000,05/06/2014,|F1100|,|24K|,|D|,|H0OH06189|
|2014|,|4061920141215566782|,|C00164145|,|N00034277|,2500,05/22/2014,|F3100|,|24K|,|D|,|H2NY22139|

这是我的rawdata的链接

【问题讨论】:

  • 您需要致电dfy[['cycle', 'cid']]。您可以在docs 中找到更多信息
  • 感谢您的评论。我更新了上面的代码并正在阅读文档!新错误AttributeError: 'DataFrame' object has no attribute 'map'

标签: python pandas


【解决方案1】:

读入csv 并使用Series str 操作如str.replace

import pandas as pd
from cStringIO import StringIO

# Fake csv text for example
textcsv = '''
cycle,cid,amount,date,realcode,type,di,feccandid
|2014|,|N00029285|,1000,05/15/2014,|E1600|,|24K|,|D|,|H8TX22107|
|2014|,|N00026722|,5000,10/22/2013,|G4600|,|24K|,|D|,|H4TX28046|
|2014|,|N00030676|,4   ,03/26/2014,|C2100|,|24Z|,|D|,|H0MO07113|
'''
# Read in fake csv
# normally you would use: dfy = pd.read_csv('/path/to/file.csv')
dfy = pd.read_csv(StringIO(textcsv))

# Replace '|' in cells with series.str methods
for col in dfy:
    if dfy[col].dtype == 'object':
        dfy[col] = dfy[col].str.replace('|', '')

print day

  cycle        cid  amount        date realcode type di  feccandid
0  2014  N00029285    1000  05/15/2014    E1600  24K  D  H8TX22107
1  2014  N00026722    5000  10/22/2013    G4600  24K  D  H4TX28046
2  2014  N00030676       4  03/26/2014    C2100  24Z  D  H0MO07113

【讨论】:

  • 感谢您的评论!我应用了代码并得到了以下错误:ImportError Traceback (most recent call last) <ipython-input-50-56a6ef8c3c42> in <module>() 1 import pandas as pd ----> 2 from cStringIO import StringIO 3 4 # Fake csv text for example 5 ImportError: No module named 'cStringIO'
  • 如果你使用 python 3 你应该使用io.StringIO
  • from io import StringIO
  • 再次感谢您!我进行了更正并编辑了原始问题以包含指向我的原始数据的链接。我现在返回一个空的df:Empty DataFrame Columns: [Thesis/CRSP/CampaignFin14/pacs14.txt] Index: []
  • 我看不到哪一行的指示;我运行了代码,没有错误,但是当我 dfy.head 它返回 `Thesis/CRSP/CampaignFin14/pacs14.txt`
【解决方案2】:

您可以预处理内存中的文件以从行中删除所有 | 并将其传递给 Pandas。

import io
import pandas as pd

with open('Thesis/CRSP/CampaignFin14/pacs14.txt', 'r') as fi:
    content = ''
    for line in fi:
        content += line.replace('|', '')

block = io.StringIO(content)
dfy2 = pd.read_csv(block, skipinitialspace=True, delim_whitespace=True)

在这里,您首先使用带有io.StringIO() 的字符串创建一个类似缓冲区的对象,然后将其传递给接受作为第一个参数文件名或缓冲区的pd.read_csv

【讨论】:

  • 感谢您的建议!我应用了您的解决方案并收到以下错误:---> 10 dfy2 = pd.read_csv(block, skipinitialspace=True, delim_whitespace=True)CParserError: Error tokenizing data. C error: Expected 1 fields in line 300866, saw 2
  • 您需要提供所有数据以供任何人解决此问题
  • 除非您想使用error_bad_lines or warn_bad_lines 跳过这些坏行(选项都在页面底部)。
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多