将findall的多个输出合并到基准帧中



我的代码旨在从多个文件中读取(下面有两个示例(,并在每个文件的多行中匹配数字,然后将所有匹配项和文件名组合到一个数据帧中。然而,我的第一个问题是,多个findall输出在多行中,我不知道如何正确地附加这些行——findall输出如下:

65
45
78
etc

以下是两个文件示例:

F1:

trust 65
musca 
linca 75
trig 
torst 50

F2:

munk 65
liki 34
grub

我希望我的代码生成以下最终数据帧:

Filename score
F1  65
F1  75
F1  50
F2  65
F2  34

我的代码尝试:

import os
import re
import pandas as pd
final={}
for f in *.txt:
    with open(f,"r") as In1:
        (filename,ext)=os.path.splitext(f)
        for line in In1:
            m=re.findall(r'd+',line)
            if len(match) > 0:
                all=[]
                all.append(m)
                final[filename]=all
df=pd.DataFrame(final.items(),columns=['Filename','Score']

有人能给我指正确的方向吗?

这里有一种方法可以满足您的问题:

import pandas as pd
from io import StringIO
fileStrings = {
'F1': '''
trust 65
musca 
linca 75
trig 
torst 50
''',
'F2': '''
munk 65
liki 34
grub
'''
}
res = pd.concat([
    pd.DataFrame({
        'Filename': k,
        'score':pd.read_csv(StringIO(v), header=None, sep=' ').iloc[:,1].dropna()}) 
    for k, v in fileStrings.items()]).reset_index(drop=True)
print(res)

输出:

  Filename  score
0       F1   65.0
1       F1   75.0
2       F1   50.0
3       F2   65.0
4       F2   34.0

上面的例子使用了从问题中详细描述的两个文件中读取的字符串。将变量fileStrings更改为包含任意数量文件的名称和字符串内容也可以。

更新:

这里有一种方法可以满足您的问题,但对于任意数量的文件:

import pandas as pd
import os
dir = os.path.join(os.getcwd(), "test_dir")
fileNames = [file for file in os.listdir(dir) if file.endswith(".txt")]
print(fileNames)
res = pd.concat([
    pd.DataFrame({
        'Filename': file,
        'score':pd.read_csv(os.path.join(dir, file), header=None, sep=' ').iloc[:,1].dropna()}) 
    for file in fileNames]).reset_index(drop=True)
print(res)

输入目录状态:

F1.txt:
trust 65
musca 
linca 75
trig 
torst 50
F2.txt:
munk 65
liki 34
grub
F3.txt:
a 3
b
c 3
F4.txt:
a 4
b
c 4

输出:

['F1.txt', 'F2.txt', 'F3.txt', 'F4.txt']
  Filename  score
0   F1.txt   65.0
1   F1.txt   75.0
2   F1.txt   50.0
3   F2.txt   65.0
4   F2.txt   34.0
5   F3.txt    3.0
6   F3.txt    3.0
7   F4.txt    4.0
8   F4.txt    4.0

您可以尝试

df1 = pd.read_csv('file1', header=None)
df2 = pd.read_csv('file2', header=None)
df = (pd.concat([df1.assign(Filename='F1'),
                 df2.assign(Filename='F2')],
                ignore_index=True)
      .dropna(subset=1)
      .rename(columns={1: 'score'})
      .drop(columns=0))
print(df)
   score Filename
0   65.0       F1
2   75.0       F1
4   50.0       F1
5   65.0       F2
6   34.0       F2

相关内容

  • 没有找到相关文章

最新更新