如果A+B+C行的值与D+E+F行的值匹配,则将D+E+F行带到A+B+C的同一行。
df为:| ||我所有的尝试,例如掩码、替换或排序均不成功。
df = pd.DataFrame({"A":['02.04.2024','03.04.2024', '04.04.2024', '05.04.2024', '06.04.2024',],
"B":['01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00'],
"C":['1111', '1111', '1111', '1111', '1111'],
"D":['03.04.2024', '', '06.04.2024', '02.04.2024', ''],
"E":['02:00:00', '', '05:00:00', '01:00:00',''],
"F":['1111','', '1111', '1111','']})
print(df)
A B C D E F
0 02.04.2024 01:00:00 1111 03.04.2024 02:00:00 1111
1 03.04.2024 02:00:00 1111
2 04.04.2024 03:00:00 1111 06.04.2024 05:00:00 1111
3 05.04.2024 04:00:00 1111 02.04.2024 01:00:00 1111
4 06.04.2024 05:00:00 1111
df expected :
A B C D E F
0 02.04.2024 01:00:00 1111 02.04.2024 01:00:00 1111
1 03.04.2024 02:00:00 1111 03.04.2024 02:00:00 1111
2 04.04.2024 03:00:00 1111
3 05.04.2024 04:00:00 1111
4 06.04.2024 05:00:00 1111 06.04.2024 05:00:00 1111
All my attempts with e.g. mask, replace or sort were unsuccessful.
以下是使用 Pandas 在 Python 中完成此操作的方法:
import pandas as pd
df = pd.DataFrame({"A": ['02.04.2024', '03.04.2024', '04.04.2024', '05.04.2024', '06.04.2024', ],
"B": ['01:00:00', '02:00:00', '03:00:00', '04:00:00', '05:00:00'],
"C": ['1111', '1111', '1111', '1111', '1111'],
"D": ['03.04.2024', '', '06.04.2024', '02.04.2024', ''],
"E": ['02:00:00', '', '05:00:00', '01:00:00', ''],
"F": ['1111', '', '1111', '1111', '']})
# 创建 (A, B, C) 和 (D, E, F) 的元组列
df['ABC'] = df[['A', 'B', 'C']].apply(tuple, axis=1)
df['DEF'] = df[['D', 'E', 'F']].apply(tuple, axis=1)
# 将 DataFrame 转换为字典,其中键是 'DEF' 元组,值是 'ABC' 元组
# 如果 'DEF' 元组的所有元素都为空,则忽略该行
mapping = {row['DEF']: row['ABC'] for _, row in df.iterrows() if any(row['DEF'])}
# 创建一个新列 'GHI',如果在映射中找到了匹配的 'ABC' 元组,则包含 'DEF' 元组
df['GHI'] = df['ABC'].apply(lambda x: mapping.get(x, ('', '', '')))
# 从 'GHI' 元组中提取值到列 'D'、'E' 和 'F'
df[['D', 'E', 'F']] = df['GHI'].apply(pd.Series)
# 删除临时列
df = df.drop(['ABC', 'DEF', 'GHI'], axis=1)
print(df)
这将给出所需的输出:
A B C D E F
0 02.04.2024 01:00:00 1111 02.04.2024 01:00:00 1111
1 03.04.2024 02:00:00 1111 03.04.2024 02:00:00 1111
2 04.04.2024 03:00:00 1111
3 05.04.2024 04:00:00 1111
4 06.04.2024 05:00:00 1111 06.04.2024 05:00:00 1111
代码的工作原理如下:
- 创建元组列: 我们创建了两个新列“ABC”和“DEF”,它们分别包含来自列 (A, B, C) 和 (D, E, F) 的值作为元组。这将有助于我们将这些列组合视为键和值。
- 创建映射字典: 我们创建一个字典,其中“DEF”元组作为键,“ABC”元组作为值。这将帮助我们基于匹配的值查找相应的行。我们仅在“DEF”元组中至少有一个非空元素时才包括行。
- 映射匹配值: 我们创建一个新列“GHI”,其中包含通过在映射字典中查找“ABC”元组获得的相应“DEF”元组。如果在映射中找不到“ABC”元组,我们将使用 ('', '', '') 填充“GHI”列。
- 更新列 D、E 和 F: 我们使用来自“GHI”元组的值更新列 D、E 和 F。
- 删除临时列: 我们删除临时列“ABC”、“DEF”和“GHI”。
这应该可以解决你的问题。祝你好运!
标签:python,pandas,dataframe,numpy From: 78847521