【问题标题】:Python: How do I change a value in column A if another value in column B repeats itself?Python:如果 B 列中的另一个值重复,我如何更改 A 列中的值?
【发布时间】:2019-04-24 04:26:20
【问题描述】:

我在一个文件夹中有许多具有相同列的 Excel 文件。我需要浏览每个文件并比较一个文件的“用户编号”列的哪些值与另一个文件相同。然后基于此操作另一个名为“日期”的列。例如:

A2018_02_01 file has:          

User_Number    Date            
18732A         2017-06-22
27192B         2017-08-06    
23872Z         2017-08-06    
82716A         2017-09-18      
77629B         2017-09-12      

A2018_02_02 file has:

User_Number    Date
18732A        2017-06-22
27192B        2017-08-06
54321R         2017-12-11
23872Z        2017-11-04
18732A        2017-06-25

所以在这种情况下,我希望程序检查用户编号值是否匹配,然后,如果一个文件的日期 - 链接到这个数字 - 与另一个文件的日期不同,我想更改两个日期是最早的日期。

在这种情况下,我会:

A2018_02_01 file has:          

User_Number    Date            
18732A         2017-06-22      
27192B         2017-08-06      
23872Z         2017-08-06      
82716A         2017-09-18      
77629B         2017-09-12      

A2018_02_02 file has:

User_Number    Date
18732A         2017-06-22
27192B         2017-08-06
54321R         2017-12-11
23872Z         2017-08-06
18732A         2017-06-22

我附加了所有文件:

import os
import glob
import pandas as pd

path=r'C/.../files'
files = os.listdir(path)
df = pd.DataFrame()

for f in glob.glob(path + "/*.xlsx"):
    data = pd.read_excel(f,header=2)
    df=df.append(data)
    df["Date"]=pd.to_datetime(df["Date"], errors='coerce')

逻辑不像javascript逻辑那样工作,所以我不知道如何做这个条件。我试过了:

df_number = df["User Number"]
for number in df[df_number.duplicated()]:
    number.df["Date"]number.df["Date"].min()

还有其他方法,但没有任何效果。任何帮助表示赞赏。

【问题讨论】:

  • 你确定你的代码是完整的吗?没有'='的最后一行代码似乎是无稽之谈
  • 它没有完成,我还在努力理解其中的逻辑。我不知道如何根据 number 的值更改日期(同时比较两个日期以查看哪个日期最旧)。

标签: python pandas dataframe series glob


【解决方案1】:

我的解决方案是创建一个包含所有最短日期的主映射器:

master=pd.concat([df1, df2]).groupby('User_Number').min()

然后将每个数据框加入到master中以找到调整后的日期:

df1.join(master,rsuffix='_adj',on='User_Number')[['User_Number', 'Date_adj']])
df2.join(master,rsuffix='_adj',on='User_Number')[['User_Number', 'Date_adj']])

输出:

    User_Number    Date_adj
0      18732A  2017-06-22
1      27192B  2017-08-06
2      23872Z  2017-08-06
3      82716A  2017-09-18
4      77629B  2017-09-12

   User_Number    Date_adj
0      18732A  2017-06-22
1      27192B  2017-08-06
2      54321R  2017-12-11
3      23872Z  2017-08-06
4      18732A  2017-06-22

使其适应您的代码:

list_of_df = []
for f in glob.glob(path + "/*.xlsx"):
    data = pd.read_excel(f,header=2)
    list_of_df.append(data)

df = pd.concat(list_of_df)
df["Date"]=pd.to_datetime(df["Date"], errors='coerce')
master=df.groupby('User_Number').min()

for aux_df in list_of_df:
   aux_df['Date'] = aux_df.join(master,rsuffix='_adj',on='User_Number')[['Date_adj']])

【讨论】:

  • 我做到了 :) 只是另一个问题:在这种情况下,您比较了 2 个数据帧。如何使用未知数量的数据帧来做到这一点?我有一个包含 x 个数据框的文件。
  • 当你说我比较时,我猜你指的是两个数据帧的串联。如果您有数据框列表,pd.concat(list_of_df) 将从您的所有 dfs 中创建一个
  • for f in glob.glob(path + "/*.xlsx"): data = pd.read_excel(f,header=2) df=df.concat(data) .groupby ('User_Number').min() data.join(master,rsuffix='_adj',on='User_Number')[['User_Number', 'Date_adj']]) 但是当我调用数据时,我得到提示数据未定义的错误
  • 我更新了我的答案以更好地适应您的原始代码
  • 哦,好的,我明白了。谢谢(:
猜你喜欢
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多