设定列表的值为数据帧列表

2024-06-30 17:05:13 发布

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

场景:我有两个列表,一个是具有名称的字符串列表,另一个是具有各种内容的数据帧列表。我试图将第一个列表中的值放入第二个列表中

数据示例:

list1 = ['jan18', 'feb18', 'mar18', 'apr18', 'may18']

列表2是具有以下结构的数据帧列表:

DF1_LIST2:
row1      row2      row3    row4
           5         55      12
           3         51      11
           3         52      11
           9         59      11

DF2_LIST2:
row1      row2      row3    row4
           9         91      7
           5         1       23
           3         24      56
           9         68      21

我的目标是将list1的第一个元素添加到list2的第一个数据帧的第一列的所有单元格中;然后将list2的第二个元素添加到list2的第二个数据帧的第一列的所有单元格中,依此类推。输出类似于:

DF1_LIST2:
row1      row2      row3    row4
jan18      5         55      12
jan18      3         51      11
jan18      3         52      11
jan18      9         59      11

DF2_LIST2:
row1      row2      row3    row4
feb18      9         91      7
feb18      5         1       23
feb18      3         24      56
feb18      9         68      21

到目前为止,我尝试建立一个三重for循环,第一个循环遍历list1的项,第二个循环遍历list2的数据帧,第三个循环遍历每个数据帧的行:

import pandas as pd
import os
from os import listdir
from os.path import isfile, join
import glob

# Get File Names
mypath = "//DGMS/Desktop/uploaded"
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]

# Get dates
onlyfiles = [name.split("_")[0] for name in onlyfiles]    
df_of_names = pd.DataFrame(onlyfiles) 

# Get File Contents
all_files = glob.glob(os.path.join(mypath, "*.xls*"))
contentdataframes = [pd.read_excel(f) for f in all_files]

for dfs in contentdataframes:
dfs.insert(0,"date*","")
dfs.insert(1,"apply*","")

for date in onlyfiles:  
     for dfs in contentdataframes:  
        for row in dfs.itertuples(index=True):
            dfs.set_value(row,0,date)

这给了我一个错误,我相信是因为header列,它仍然是一个普通的行,而不是一个索引

问题:有合适的方法吗


Tags: 数据inimport列表forrow1row2row3
2条回答

您可以通过^{}从完整路径中提取文件名。然后用^{}换行:

import os

def extract_name(x):
    return os.path.splitext(fp)[0].split('_')[0]

dfs = [pd.read_excel(fp).assign(row1=extract_name(fp)) for fp in all_files]

使用^{}在每个DataFrame中添加新列:

d = [pd.read_excel(f).assign(row1=os.path.basename(f).split('.')[0].split('_')[0])
     for f in all_files]

编辑:

如果希望处理列并且.assign处理多个列的可读性较差,可以使用loop处理每个DataFrame并最后附加到list

contentdataframes = []
for f in all_files:
    df = pd.read_excel(f)
    df['col1'] = 10
    df['col2'] = 'string1'
    df['row1'] = os.path.basename(f).split('.')[0].split('_')[0]
    contentdataframes.append(df)

相关问题 更多 >