2 个数据帧之间的一对一列值比较 - pandas
one to one column-value comparison between 2 dataframes - pandas
我有 2 个数据框 -
print(d)
Year Salary Amount Amount1 Amount2
0 2019 1200 53 53 53
1 2020 3443 455 455 455
2 2021 6777 123 123 123
3 2019 5466 313 313 313
4 2020 4656 545 545 545
5 2021 4565 775 775 775
6 2019 4654 567 567 567
7 2020 7867 657 657 657
8 2021 6766 567 567 567
print(d1)
Year Salary Amount Amount1 Amount2
0 2019 1200 53 73 63
import pandas as pd
d = pd.DataFrame({
'Year': [
2019,
2020,
2021,
] * 3,
'Salary': [
1200,
3443,
6777,
5466,
4656,
4565,
4654,
7867,
6766
],
'Amount': [
53,
455,
123,
313,
545,
775,
567,
657,
567
],
'Amount1': [
53,
455,
123,
313,
545,
775,
567,
657,
567
], 'Amount2': [
53,
455,
123,
313,
545,
775,
567,
657,
567
]
})
d1 = pd.DataFrame({
'Year': [
2019
],
'Salary': [
1200
],
'Amount': [
53
],
'Amount1': [
73
], 'Amount2': [
63
]
})
我想比较数据帧 d1 的 'Salary' 值,即 1200 与数据帧 d 中 'Salary' 的所有值,如果它是 >= 或 <,则设置一个计数(布尔比较) - 这将对所有列(金额、金额 1、金额 2 等)完成,如果 d1 的任何一列中的值是 NaN/None,则不需要进行比较。列的名称将始终相同,因此基本上是一对一的列比较。
我的方法和想法-
我可以通过 -
在列表中获取 d1 的值
l = []
for i in range(len(d1.columns.values)):
if i == 0:
continue
else:
num = d1.iloc[0, i]
l.append(num)
print(l)
# list comprehension equivalent
lst = [d1.iloc[0, i] for i in range(len(d1.columns.values)) if i != 0]
[1200, 53, 73, 63]
然后使用 iterrows 遍历数据帧 d OR 中的所有列和行
我可以迭代 d,然后通过遍历 d1 执行类似的比较——但这些对于高维数据帧(在本例中为 d)来说会很耗时。
更有效或 pythonic 的方法是什么?
IIUC,你可以这样做:
(df1 >= df2.values).sum()
输出:
Year 9
Salary 9
Amount 9
Amount1 8
Amount2 8
dtype: int64
我有 2 个数据框 -
print(d)
Year Salary Amount Amount1 Amount2
0 2019 1200 53 53 53
1 2020 3443 455 455 455
2 2021 6777 123 123 123
3 2019 5466 313 313 313
4 2020 4656 545 545 545
5 2021 4565 775 775 775
6 2019 4654 567 567 567
7 2020 7867 657 657 657
8 2021 6766 567 567 567
print(d1)
Year Salary Amount Amount1 Amount2
0 2019 1200 53 73 63
import pandas as pd
d = pd.DataFrame({
'Year': [
2019,
2020,
2021,
] * 3,
'Salary': [
1200,
3443,
6777,
5466,
4656,
4565,
4654,
7867,
6766
],
'Amount': [
53,
455,
123,
313,
545,
775,
567,
657,
567
],
'Amount1': [
53,
455,
123,
313,
545,
775,
567,
657,
567
], 'Amount2': [
53,
455,
123,
313,
545,
775,
567,
657,
567
]
})
d1 = pd.DataFrame({
'Year': [
2019
],
'Salary': [
1200
],
'Amount': [
53
],
'Amount1': [
73
], 'Amount2': [
63
]
})
我想比较数据帧 d1 的 'Salary' 值,即 1200 与数据帧 d 中 'Salary' 的所有值,如果它是 >= 或 <,则设置一个计数(布尔比较) - 这将对所有列(金额、金额 1、金额 2 等)完成,如果 d1 的任何一列中的值是 NaN/None,则不需要进行比较。列的名称将始终相同,因此基本上是一对一的列比较。
我的方法和想法- 我可以通过 -
在列表中获取 d1 的值l = []
for i in range(len(d1.columns.values)):
if i == 0:
continue
else:
num = d1.iloc[0, i]
l.append(num)
print(l)
# list comprehension equivalent
lst = [d1.iloc[0, i] for i in range(len(d1.columns.values)) if i != 0]
[1200, 53, 73, 63]
然后使用 iterrows 遍历数据帧 d OR 中的所有列和行 我可以迭代 d,然后通过遍历 d1 执行类似的比较——但这些对于高维数据帧(在本例中为 d)来说会很耗时。 更有效或 pythonic 的方法是什么?
IIUC,你可以这样做:
(df1 >= df2.values).sum()
输出:
Year 9
Salary 9
Amount 9
Amount1 8
Amount2 8
dtype: int64