我的代码旨在从多个文件中读取(下面有两个示例(,并在每个文件的多行中匹配数字,然后将所有匹配项和文件名组合到一个数据帧中。然而,我的第一个问题是,多个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