将同一列标识符上的数据帧与不正确的outpu合并

2024-10-02 12:26:57 发布

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

场景:我有一个代码,可以从目录中读取一组excel文件,并将每个文件的内容收集到列表中的数据框中,然后将其连接起来。代码还读取另一个文件,从中获取某些标识符的数据到另一个数据帧中。你知道吗

列表中串联数据帧中的数据示例:

Iteration        Run        Value
 9154aa           3          100
 9154aa           7          112
 9154aa           1          120
 3148nf           77         58
 3148nf           7          86
 9421jh           23         27
 9421jh           42         736
 9421jh           4          44
 9421jh           9          82

其他数据帧的示例:

Iteration      Date
 9154aa      01012011
 1582he      01052013
 3148nf      01092011
 9421jh      01012010

第一个DF包含多个迭代的信息,而额外的DF包含所有迭代的一段信息。你知道吗

目标:我的目标是将与迭代相关的日期放入第一个数据帧(对应于该迭代的每一行)。你知道吗

输出示例:

Iteration        Run        Value       Date
 9154aa           3          100      01012011
 9154aa           7          112      01012011
 9154aa           1          120      01012011
 3148nf           77         58       01092011
 3148nf           7          86       01092011
 9421jh           23         27       01012010
 9421jh           42         736      01012010
 9421jh           4          44       01012010
 9421jh           9          82       01012010

问题:尽管脚本运行时没有崩溃,但由于某些原因,我的输出复制了一个(或多个)迭代条目。你知道吗

错误输出示例:

Iteration        Run        Value       Date
 9154aa           3          100      01012011
 9154aa           7          112      01012011
 9154aa           1          120      01012011
 3148nf           77         58       01092011
 3148nf           77         58       01092011
 3148nf           7          86       01092011
 3148nf           7          86       01092011
 9421jh           23         27       01012010
 9421jh           42         736      01012010
 9421jh           4          44       01012010
 9421jh           9          82       01012010

我不知道这种行为的原因。你知道吗

问题:我做错了什么?你知道吗

代码:

sourcefolder = "\\Network\DGMS\2018"
outputfolder = "\\Network\DGMS\2018"
adjustmentinputs = "//Network/DGMS/Uploader_v1.xlsm"
selectmonth = input("Please enter month ('January', 'February'...):")

# Get Adjustments
ApplyOnDates = pd.read_excel(open(adjustmentinputs, 'rb'), sheet_name='Calendar')

# Get content
all_files = glob.glob(os.path.join(sourcefolder, "*.xls*"))
contentdataframes = []
contentdataframes2 = []

for f in all_files:
    df = pd.read_excel(f)
    df['Iteration'] = os.path.basename(f).split('.')[0].split('_')[0]
    mask = df.columns.str.contains('Base|Last|Fix')
    c2 = df.columns[~mask].tolist()
    df = df[c2]
    contentdataframes.append(df)
    print (f)

concatenatedfinal = pd.concat(contentdataframes)

# Date Adjustment 
ApplyOnDates = ApplyOnDates[["IT", selectmonth]]
ApplyOnDates = ApplyOnDates.rename(index=str, columns={"IT": "Iteration", selectmonth: "Date"})

Datawithfixeddates = pd.DataFrame.merge(concatenatedfinal, ApplyOnDates, left_on='Iteration', right_on='Iteration', indicator=False) 

OBS:在这个例子中,我只使用了少量的数据,而通常情况下,它会进行几十次迭代。你知道吗


Tags: 文件数据run代码示例dfdatevalue
1条回答
网友
1楼 · 发布于 2024-10-02 12:26:57

你需要在这里使用左连接。根据documentation,left join保留第一个数据帧中的所有值,根据第一个数据帧的结构从第二个数据帧中派生值。你知道吗

这正是你需要的。因此,将合并中的参数how设置为“left”

您的数据如下:

In[13]: print(df1)
Out[13]: 
Iteration  Run  Value
0    9154aa    3    100
1    9154aa    7    112
2    9154aa    1    120
3    3148nf   77     58
4    3148nf    7     86
5    9421jh   23     27
6    9421jh   42    736
7    9421jh    4     44
8    9421jh    9     82

以及

In[15]: print(df2)
Out[15]: 
Iteration      Date
0    9154aa  01012011
1    1582he  01052013
2    3148nf  01092011
3    9421jh  01012010

以下是事实

In[16]: print(df1.merge(df2,left_on='Iteration',right_on='Iteration',how='left'))
Out[16]: 
Iteration  Run  Value      Date
0    9154aa    3    100  01012011
1    9154aa    7    112  01012011
2    9154aa    1    120  01012011
3    3148nf   77     58  01092011
4    3148nf    7     86  01092011
5    9421jh   23     27  01012010
6    9421jh   42    736  01012010
7    9421jh    4     44  01012010
8    9421jh    9     82  01012010

相关问题 更多 >

    热门问题