将带有Pandas的txt文件读入 Dataframe

gudnpqoy  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(122)

我想从here中读取txt文件,使用Dota 2 mmrs为不同的玩家读取,它的格式如下:

1) "103757918"
      2) "1"
      3) "107361667"
      4) "1"
      5) "108464725"
      6) "1"
      7) "110818765"
      8) "1"
      9) "111436016"
     10) "1"
     11) "113518306"
     12) "1"
     13) "118896321"
     14) "1"
     15) "119780733"
     16) "1"
     17) "120360801"
     18) "1"
     19) "120870684"
     20) "1"
     21) "122616345"
     22) "1"
     23) "124393917"
     24) "1"
     25) "124487030"

account_id(例如103757918)后面跟有玩家的mmr(例如1)。我怎么能在一个有两列= account_id,mmr的Pandas数据框中读到这个呢?
我不需要索引号。

qoefvg9y

qoefvg9y1#

您可以使用read_table,因为使用\n作为分隔符的read_csv不起作用。然后按如下方式移动和排列值:

df = pd.read_table('./mmr.txt', delim_whitespace=True, names=['account_id', 'mmr'])
df['account_id'] = df['mmr']
df['mmr'] = df['mmr'].shift(-1)
df = df[df.index % 2 == 0].reset_index(drop=True)

输出将为:

account_id  mmr
0   103757918   1.0
1   107361667   1.0
2   108464725   1.0
3   110818765   1.0
...
1069671 93119769    8674.0
7lrncoxx

7lrncoxx2#

按照通常的方式读取数据,每隔一行对数据进行切片并进行concat。之后,您可以将列重命名为您想要的任何名称。
以这种方式对数据进行切片假设第一个值始终是account_id,后跟mmr。请注意,在示例数据中,第25行缺少mmr,因此为空。

df = pd.read_csv(data.txt, sep='\s+', header=None)
pd.concat([df[1][::2].reset_index(drop=True),
           df[1][1::2].reset_index(drop=True)], axis=1)

以下是基于示例数据的工作示例

s = '''1) "103757918"
2) "1"
3) "107361667"
4) "1"
5) "108464725"
6) "1"
7) "110818765"
8) "1"
9) "111436016"
10) "1"
11) "113518306"
12) "1"
13) "118896321"
14) "1"
15) "119780733"
16) "1"
17) "120360801"
18) "1"
19) "120870684"
20) "1"
21) "122616345"
22) "1"
23) "124393917"
24) "1"
25) "124487030"'''

from io import StringIO

df = pd.read_csv(StringIO(s),sep='\s+', header=None)
data = pd.concat([df[1][::2].reset_index(drop=True),
              df[1][1::2].reset_index(drop=True)], axis=1)

data.columns = ['account_id', 'mmr']

    account_id  mmr
0    103757918  1.0
1    107361667  1.0
2    108464725  1.0
3    110818765  1.0
4    111436016  1.0
5    113518306  1.0
6    118896321  1.0
7    119780733  1.0
8    120360801  1.0
9    120870684  1.0
10   122616345  1.0
11   124393917  1.0
12   124487030  NaN
dxxyhpgq

dxxyhpgq3#

你可以在多行模式下使用正则表达式来查找带引号的对。我喜欢这个解决方案,因为唯一的难题是正则表达式本身。

import re
import pandas as pd

acct_mmr_pair_re = re.compile(r'"([^"]*)"[^"]*"([^"]*)"', re.MULTILINE)

with open("k.txt") as file:
    df = pd.DataFrame(acct_mmr_pair_re.findall(file.read()), 
        columns=["account_id", "mmr"])
print(df)

相关问题