簡體   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