繁体   English   中英

如何比较两个数据帧 pandas

[英]How to compare between two dataframes pandas

我有一个像下面这样的 df1,我想检查 df2 中某个列的所有值是否都在 df1 最大值和最小值之间。 如果是我想从该索引的名称列中给出值。 如果 df2 值不在其中任何一个之间,我想看看它是大于还是小于 df1 最大值或最小值中的任何一个。

data = {'Name':  ['MN1', 'MN2', 'MN3', 'MN4', 'MN5', 'MN6', 'MN7-8', 'MN9', 'MN10', 'MN11', 'MN12', 'MN13', 'MN14', 'MN15', 'MN16','MN17', 'MQ18', 'MQ19'],
        'MAX': [23, 21.7, 19.5, 17.2, 16.4, 14.2, 12.85, 11.2, 9.9, 8.9, 7.6, 7.1, 5.3, 5, 3.55, 2.5, 1.9, 0.85],
         'MIN':[21.7, 19.5, 17.2, 16.4, 14.2, 12.85, 11.2, 9.9, 8.9, 7.6, 7.1, 5.3, 5, 3.55, 2.5, 1.9, 0.85, 0.01]
        }
df1 = pd.DataFrame (data, columns = ['Name','MAX','MIN'])

我试过这个:


list = []

for i in df2['AVERAGE_AGE']:
    for index, row in df1.iterrows():
        if row['MAX'] >= i and row['MIN'] < i:
            list.append(row['Name'])
    
    if i > df1['MAX'].max():
        list.append("Postmn")
    elif i < df1['MIN'].min():
        list.append("Premn")
    
df2['MNname'] = list

这需要很长时间,并且列表长度与 df2 的长度不匹配

你可以试试这个

(df2['AVERAGE_AGE'] < df1['MIN'].min()).value_counts()
(df2['AVERAGE_AGE'] > df1['MAX'].max()).value_counts()

这将通过给出 True 和 False 的计数来告诉您满足条件的行数。

您可以遍历第一个 dataframe 并使用pandas.DataFrame.loc为第二个设置名称:

>>> df2 = pd.DataFrame([
...   2.299367, 20.688943, 10.245027, 1.412258, 22.541987,
...   2.588420, 5.578598, 11.703629, 12.529066, 17.769196,
...   ], columns=['AVERAGE_AGE'])
>>> for index, row in df1.iterrows():
...   df2.loc[(df2.AVERAGE_AGE>=row.MIN) & (df2.AVERAGE_AGE<row.MAX),'Name'] = row.Name
... 
>>> df2
   AVERAGE_AGE   Name
0     2.299367   MN17
1    20.688943    MN2
2    10.245027    MN9
3     1.412258   MQ18
4    22.541987    MN1
5     2.588420   MN16
6     5.578598   MN13
7    11.703629  MN7-8
8    12.529066  MN7-8
9    17.769196    MN3

尝试这个:

arr = []
for i in range(df2.shape[0]):    
    # Check if the value in COLUMN_1 is between MIN and MAX value
    if ((df2['COLUMN_1'][i] > df1['MIN'][i]) and df2['COLUMN_1'][i] < df1['MAX'][i]):
        arr.append(df1['Name'][i])
    # Check if value in COLUMN_1 is less than Minimum value
    elif (df2['COLUMN_1'][i] < df1['MIN'][i]):
        arr.append(np.round(df2['COLUMN_1'][i] - df1['MIN'][i], 2))
    # Check if value in COLUMN_1 is less than Minimum value
    elif (df2['COLUMN_1'][i] > df1['MAX'][i]):
        arr.append(np.round(df2['COLUMN_1'][i] - df1['MAX'][i], 2))

df2['Name'] = pd.Series(arr)

由于您没有确切提到要在 df2 中检查的列的名称,因此我将其用作 COLUMN_1。 使用的条件和值是:

  1. 如果 COLUMN_1 中的值介于 MIN 和 MAX 之间,则获取与 df1['Name'] 对应的数据
  2. 如果 COLUMN_1 中的值小于 MIN,则执行(COLUMN_1 中的值 - MIN)给出负值
  3. 如果 COLUMN_1 中的值大于 MAX,则执行(COLUMN_1 中的值 - MAX)给出正值

希望这有效!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM