gpt4 book ai didi

python - 将 Pandas 数据帧合并到具有不正确输出的同一列标识符上

转载 作者:行者123 更新时间:2023-12-01 09:11:40 24 4
gpt4 key购买 nike

场景:我有一个代码,它从目录中读取一组 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:在示例中我只使用了少量数据,而通常情况下它会进行数十次迭代。

最佳答案

您需要在此处使用左连接。根据documentation ,左连接保留第一个 DataFrame 中的所有值,根据第一个 DataFrame 的结构替换第二个 DataFrame 中的值。

设置参数pd.DataFrame.merge(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

关于python - 将 Pandas 数据帧合并到具有不正确输出的同一列标识符上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51614014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com