Mam dwie ramki danych, próbuję użyć wpisów z df1, aby ograniczyć kwoty w df2, a następnie dodać je. Wygląda na to, że mój kod dobrze ogranicza, ale nie sumuje kwot.

Kod:

import pandas as pd

df1 = pd.DataFrame({'Caps':['25','45','65']})

df2 = pd.DataFrame({'Amounts':['45','25','65','35','85']})

df1['Capped'] = df1.apply(lambda row: df2['Amounts'].where(
     df2['Amounts'] <= row['Caps'], row['Caps']).sum(), axis=1)

Wynik:

>>> df1

  Caps      Capped
0   25  2525252525
1   45  4525453545
2   65  4525653565
2
Eduardo Espinola 2 styczeń 2020, 09:07

1 odpowiedź

Najlepsza odpowiedź

Najpierw konieczne jest przekonwertowanie wartości do liczb całkowitych przez {{ X0}}:

df1['Caps'] = df1['Caps'].astype(int)
df2['Amounts'] = df2['Amounts'].astype(int)
df1['Capped'] = df1.apply(lambda row: df2['Amounts'].where(
                   df2['Amounts'] <= row['Caps'], row['Caps']).sum(), axis=1)

print (df1)
   Caps  Capped
0    25     125
1    45     195
2    65     235

W celu poprawy wydajności jest możliwe użycie {x0}} z nadawaniem:

df1['Caps'] = df1['Caps'].astype(int)
df2['Amounts'] = df2['Amounts'].astype(int)

am = df2['Amounts'].to_numpy()
ca = df1['Caps'].to_numpy()
#pandas below 0.24
#am = df2['Amounts'].values
#ca = df1['Caps'].values
df1['Capped'] = np.where(am <= ca[:, None], am[None, :], ca[:, None]).sum(axis=1)
print (df1)
   Caps  Capped
0    25     125
1    45     195
2    65     235
1
jezrael 2 styczeń 2020, 06:23