和Pandas有问题吗数据框代表

2024-10-05 14:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

要点是我需要编写一个数据库排序程序,它大部分都可以工作,但这里有一点小麻烦;对于最后一部分,它需要作为平均值进行排序,但问题是我的CSV文件没有分隔,所以它看起来像这样:

     name             name1         score1  score2 score3 
0    ['Harry'        'Potter'       9       10     8]      
1    ['Scrooge'      'McDuck'       7       5      6]
2    ['Shovel'       'Knight'       4       2      3]

我需要程序将分数从高到低排序为可能的选项之一,但是,列中存在]会导致问题,因此我尝试这样做:

df = pd.read_csv('classa.csv')
print('Sorted scores')
scores3 = df['score3']
scores3 = scores3.replace(']', '')
scores = df[['score1', 'score2', 'score3']].values
a = np.array(df[['score1', 'score2', 'score3']])
b = a.astype(int)
a.sort(axis=1)
df['score1'], df['score2'], df['score3'] = a.T
print(df)

我得到一条错误信息:

Traceback (most recent call last):
  File "D:\Python code\Task 3 pandas testing 12.py", line 69, in <module>
    b = a.astype(int)
ValueError: invalid literal for int() with base 10: ' 8]'

所以我删除']'的尝试不起作用,我也不知道为什么。有人知道它为什么不能正常工作吗?你知道吗

编辑:@Anand S Kumar,你的解决方案可行,但不是我想要的。 我需要将数据按行水平排序,而不是垂直排序,因此最终结果应该如下所示

     name             name1         score1  score2 score3 
0    ['Harry'        'Potter'       10      9      8]      
1    ['Scrooge'      'McDuck'       7       6      5]
2    ['Shovel'       'Knight'       4       3      2]

通常,用于数据库目的的CSV文件如下所示:

name   name1  score1  score2 score3 
Harry, Potter, 10,      8,      9

但是,由于结果没有分隔,因此它们的前两列有[]和“”。你知道吗

有人告诉我测向排序不会混淆不同列的值,所以我假设如果我不能更改实际列的值,那么我可以尝试使用从高到低排序的值创建另一列,如下所示:

     name             name1         score1  score2 score3  highestscoretolowestscore
0    ['Harry'        'Potter'       9       10     8]      10 9 8
1    ['Scrooge'      'McDuck'       7       5      6]      7 6 5
2    ['Shovel'       'Knight'       4       2      3]      4 3 2

我在程序中添加了以下内容:

df['highestscoretolowestscore'] = df.sort(['score1','score2','score3'], ascending=False, inplace=True, axis=0)

然而,它导致了这种情况的发生:

           name     name1  score1  score2  score3 highestscoretolowestscore
0     ['Atticus'   'Finch'       9      10       8                      None
1         ['Jem'   'Finch'       7       5       6                      None
2  ['Jean Louise   'Finch'       4       2       3                      None

所以我认为数据帧分配有问题,但我不确定如何补救。你知道吗


Tags: namedf排序intname1knightshovelscrooge
1条回答
网友
1楼 · 发布于 2024-10-05 14:22:13

嗯,不知道你的csv看起来怎么样,有一种更好的方法可以根据csv的样子来做。但基本上你的问题是当你这样做的时候-

scores3 = scores3.replace(']', '')

您只需将分数3指向一个新的系列,这不会改变原始数据帧中的任何内容。你知道吗

你需要做-

df = pd.read_csv('classa.csv')
print('Sorted scores')
df['score3'] = df['score3'].str.replace(']', '')
df['score3'] = df['score3'].astype(int)
df = df.sort(['score1', 'score2', 'score3'], ascending=False)

示例/演示-

In [82]: df
Out[82]:
         name     name1  score1  score2 score3
0    ['Harry'  'Potter'       9      10     8]
1  ['Scrooge'  'McDuck'       7       5     6]
2   ['Shovel'  'Knight'       4       2     3]

In [83]: print('Sorted scores')
Sorted scores

In [84]: df['score3'] = df['score3'].str.replace(']', '')

In [85]: df['score3'] = df['score3'].astype(int)

In [86]: df = df.sort(['score1', 'score2', 'score3'], ascending=False)

In [87]: df
Out[87]:
         name     name1  score1  score2  score3
0    ['Harry'  'Potter'       9      10       8
1  ['Scrooge'  'McDuck'       7       5       6
2   ['Shovel'  'Knight'       4       2       3

对于您想要的(按行排序),您可以执行(非常类似于您自己的方法)—

df['score3'] = df['score3'].str.replace(']', '')
df['score3'] = df['score3'].astype(int)
a = np.array(df[['score1', 'score2', 'score3']])
a = a.astype(int)
a.sort(axis=1)
df['score1'], df['score2'], df['score3'] = a.T[::-1,:]

相关问题 更多 >