Jak uzupełnić brakującą wartość na podstawie innych kolumn w ramce danych Pandas?

19

Załóżmy, że mam ramkę danych 5 * 3, w której trzecia kolumna zawiera brakującą wartość

1 2 3
4 5 NaN
7 8 9
3 2 NaN
5 6 NaN

Mam nadzieję wygenerować wartość dla reguły opartej na brakujących wartościach dla pierwszej kolumny w drugim produkcie

1 2 3
4 5 20 <--4*5
7 8 9
3 2 6 <-- 3*2
5 6 30 <-- 5*6

Jak mogę to zrobić za pomocą ramki danych? Dzięki.

Jak dodać warunek, aby obliczyć brakującą wartość w ten sposób?

if 1st % 2 == 0 then 3rd = 1st * 2nd else 3rd = 1st + 2nd

1 2 3
4 5 20 <-- 4*5 because 4%2==0
7 8 9
3 2 5 <-- 3+2 because 3%2==1
5 6 11 <-- 5+6 because 5%2==1
KyL
źródło
Nie możesz tego zrobić, ponieważ rozmiar nie będzie równy
Mayur Dangar
Czy potrafisz poszerzyć swoją odpowiedź? Dlaczego nie jest to możliwe i co mógłby zrobić, aby rozwiązać problem?
Damian Melniczuk
hej, nawet ja mam to samo pytanie. ale co jeśli dane, z którymi mam do czynienia, są tekstowe? taki warunek jest taki, jakby „jeśli” składniki ”zawierały kurczaka, to„ typ ”= non-veg”
user7389747

Odpowiedzi:

17

Zakładając, że trzy kolumny ramki danych to a, bi c. To jest to, czego chcesz:

df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)

Pełny kod:

df = pd.DataFrame(
    np.array([[1, 2, 3], [4, 5, np.nan], [7, 8, 9], [3, 2, np.nan], [5, 6, np.nan]]), 
    columns=['a', 'b', 'c']
)
df['c'] = df.apply(
    lambda row: row['a']*row['b'] if np.isnan(row['c']) else row['c'],
    axis=1
)
Lodowate
źródło
Kilka lat później, ale działa to tylko wtedy, gdy kolumny są numeryczne. np.isnannie obsługuje danych nienumerycznych. Nie jest to problemem, ponieważ PO miał kolumny numeryczne i operacje arytmetyczne, ale poza tym pd.isnulljest lepszą alternatywą.
Adarsh ​​Chavakula
3

Inna opcja:

df.loc[(pd.isnull(df.C)), 'C'] = df.A * df.B

Vishal
źródło
3

Co powiesz na użycie fillna()metody ramki danych?

df['C'].fillna(df.A * df.B)

yosemite_k
źródło
2

Zakładając, że trzy kolumny w twojej ramce danych to a, bi c. Następnie możesz wykonać wymaganą operację w następujący sposób:

values = df['a'] * df['b']
df['c'] = values.where(df['c'] == np.nan, others=df['c'])
enterML
źródło
1
Lubnp.where(pd.isnull(df.c), df.a * df.b, df.c)
Valentas