Python:如果 B 列中的另一个值重复出现,我该如何更改 A 列中的值?
Python: How do I change a value in column A if another value in column B repeats itself?
我在一个文件夹中有很多 excel 个具有相同列的文件。我需要浏览每个文件并比较一个文件的 "User Number" 列的哪些值与另一个文件相同。然后基于此操作另一个名为 "Date" 的列。例如:
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()
和其他方法一样,但没有任何效果。感谢任何帮助。
我的解决方案是创建一个包含所有最小日期的主映射器:
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']])
我在一个文件夹中有很多 excel 个具有相同列的文件。我需要浏览每个文件并比较一个文件的 "User Number" 列的哪些值与另一个文件相同。然后基于此操作另一个名为 "Date" 的列。例如:
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()
和其他方法一样,但没有任何效果。感谢任何帮助。
我的解决方案是创建一个包含所有最小日期的主映射器:
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']])