gpt4 book ai didi

python - 格式化 pandas 中的数据

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:22 24 4
gpt4 key购买 nike

我尝试运行代码:

import pandas as pd

df = pd.read_csv('test.csv', sep=',', header=None, names=['datatable', 'col'])

def replace_letter(group):
letters = group.isin(['T', 'Q']) # select letters
group[letters] = int(group[~letters].max()) + 1 # replace by next max
return group


df['col'] = df.groupby('datatable').transform(replace_letter)
print df

关于数据:

DatatableA,1
DatatableA,2
DatatableA,3
DatatableA,4
DatatableA,5
DatatableB,1
DatatableB,6
DatatableB,T
DatatableB,3
DatatableB,4
DatatableB,5
DatatableB,2
DatatableC,3
DatatableC,4
DatatableC,2
DatatableC,1
DatatableC,Q
DatatableC,5
DatatableC,T

希望能产生以下结果

DatatableA,1
DatatableA,2
DatatableA,3
DatatableA,4
DatatableA,5
DatatableB,1
DatatableB,6
DatatableB,7
DatatableB,3
DatatableB,4
DatatableB,5
DatatableB,2
DatatableC,3
DatatableC,4
DatatableC,2
DatatableC,1
DatatableC,6
DatatableC,5
DatatableC,6

我收到了回溯:

Traceback (most recent call last):
File "C:/test.py", line 11, in <module>
df['col'] = df.groupby('datatable').transform(replace_letter)
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 1981, in transform
res = path(group)
File "C:\Python27\lib\site-packages\pandas\core\groupby.py", line 2006, in <lambda>
slow_path = lambda group: group.apply(lambda x: func(x, *args, **kwargs), axis=self.axis)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 4416, in apply
return self._apply_standard(f, axis)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 4491, in _apply_standard
raise e
ValueError: ("invalid literal for int() with base 10: 'col'", u'occurred at index col')

我正在尝试用该表的下一个最大整数替换字母 T 或任何其他与此相关的字母。第一个表不包含错误,第二个表包含 1 个 T,第三个表包含 2 x t。有没有我正确使用过的东西,但我一直想更多地使用 pandas,因为该库对于数据操作似乎非常有用。

编辑 1

这确实是一个标题问题,只需将 header 更改为 =True 即可正常工作。但是我仍然无法让这段代码执行我想要的操作。

import pandas as pd

df = pd.read_csv('test.csv', sep=',', header=True, names=['datatabletest', 'col'])

def replace_letter(group):
letters = group.isin(['T', 'Q']) # select letters
group[letters] = int(group[~letters].max()) + 1 # replace by next max
return group

df["duplicate"] = df['col']
print df
df['col'] = df.groupby('datatabletest').transform(replace_letter)
print df

我希望复制该列,以便我有一份原始的副本,仅更改其中一列中的字母。你能看出我做错了什么吗?

最佳答案

我猜你的csv文件实际上包含一个标题,即它的第一行是datatable,col。然后,当您指定 header=None 时,此 header 将作为数据帧的第一行加载。您应该使用 skiprows 参数跳过 header ,或者从文件中读取它并删除 header=None

比较这两个示例:

>>> s = "DatatableA,1"
>>> df = pd.read_csv(StringIO(s), sep=',', header=None,
... names=['datatable', 'col'])
>>> df['col'] = df.groupby('datatable').transform(replace_letter)
>>> df
datatable col
0 DatatableA 1

但是

>>> df = pd.read_csv(StringIO('datatable,col\n'+s),  sep=',',
... header=None, names=['datatable', 'col'])
>>> df['col'] = df.groupby('datatable').transform(replace_letter)
Traceback (most recent call last):
...
ValueError: ("invalid literal for int() with base 10: 'col'", u'occurred at index col')

关于python - 格式化 pandas 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com