1
votes

Comment comparer entre deux pandas DataFrames

J'ai un df1 comme ci-dessous et je veux vérifier si toutes les valeurs de certaines colonnes de df2 sont entre la valeur max et min de df1. Si c'est le cas, je veux donner la valeur de la colonne de nom de cet index. Si la valeur df2 n'est pas entre l'une de ces valeurs, je veux voir si elle est plus grande ou plus petite que l'une des valeurs max ou min de df1.

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

J'ai essayé ceci:

XXX

cela prend beaucoup de temps et la longueur de la liste ne correspond pas à la longueur de df2


0 commentaires

3 Réponses :


0
votes

Vous pouvez essayer ceci

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

Cela vous indiquera le nombre de lignes qui remplissent les conditions en donnant le nombre de Vrai et Faux.


0 commentaires

0
votes

Vous pouvez boucler sur la première trame de données et définir des noms pour la seconde en utilisant 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


0 commentaires

0
votes

Essayez ceci:

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)

Comme vous n'avez pas mentionné exactement le nom de la colonne à vérifier dans df2, je l'ai utilisé comme COLUMN_1. Les conditions et valeurs utilisées sont:

  1. Si la valeur de COLUMN_1 est comprise entre MIN et MAX, récupérez les données correspondant à df1 ['Name']
  2. Si la valeur de COLUMN_1 est inférieure à MIN, alors faites (valeur de COLUMN_1 - MIN) donnant une valeur négative
  3. Si la valeur de COLUMN_1 est supérieure à MAX, alors faites (valeur de COLUMN_1 - MAX) donnant une valeur positive

J'espère que cela fonctionne!


0 commentaires