gpt4 book ai didi

python - 按表格格式化列表数据

转载 作者:行者123 更新时间:2023-12-01 05:28:38 25 4
gpt4 key购买 nike

我正在尝试分析一些数据,但我的数据包含需要标准化的字母。我希望能够做的是,对于数据中的每个数据表(此 csv 数据包含 3 个数据表),将字母 T 或任何其他字母替换为该表的下一个最大整数。第一个表不包含错误,第二个表包含 1 个 T,第三个表包含 2 个 t。

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

我希望这是一个相对容易编码的事情,但是,虽然我知道如何在特定列或特定行中用数字替换所有 T,但我不知道如何根据它所在的数据表将每个 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

这里,DatatableA 中没有发生任何事情,DatatableB 中唯一的 T 被替换为下一个最大整数,在本例中它被替换为 7,在 DatatableC 中,有两个异常数据点,它们都被替换为下一个最大整数,即6.

如果有人能给我指出正确的方向或提供一些内容的片段,我将不胜感激。一如既往,我们也欢迎提出建设性意见。

编辑回复 elyase

我尝试运行代码:

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

我收到了回溯:

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')

是否有一些我正确使用的东西,我可以使用 AEA 答案,但我一直想更多地使用 pandas,因为该库对于数据操作似乎非常有用。

最佳答案

Pandas非常适合此类任务:

读取您的 csv:

>>> import pandas as pd

>>> df = pd.read_csv('data.csv', sep=',', header=None, names=['datatable', 'col'])
>>> df.head()
datatable col
0 DatatableA 1
1 DatatableA 2
2 DatatableA 3
3 DatatableA 4
4 DatatableA 5

分组、选择并替换最大值:

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)
>>> df

datatable col
0 DatatableA 1
1 DatatableA 2
2 DatatableA 3
3 DatatableA 4
4 DatatableA 5
5 DatatableB 1
6 DatatableB 6
7 DatatableB 7
8 DatatableB 3
9 DatatableB 4
10 DatatableB 5
11 DatatableB 2
12 DatatableC 3
13 DatatableC 4
14 DatatableC 2
15 DatatableC 1
16 DatatableC 6
17 DatatableC 5
18 DatatableC 6

写入 csv:

df.to_csv('result.csv', index=None, header=None)

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

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