簡體   English   中英

根據條件更改單元格值

[英]Change cell value with condition

我有一個 dataframe:

df = pd.DataFrame(
        {'a': ['banana', 'coconut', 'banana', 'apple'],
         'b': ['rice', 'bean', 'rice', 'soap'],
         'c': ['mouse', 'dog', None,'apple'],
         'd': ['cat', 'soap', 'beef', 'rabbit']}
    )


         a     b     c       d
0   banana  rice   mouse  cat
1  coconut  bean   dog    soap
2   banana  rice  None    cat
3    apple  soap  apple   rabbit

如果一行包含值 None(此處在索引 2 中),我們將查找其值完全相同的行,並將 None 的值更改為同一列的值。 因此,此處索引 0 的行和索引 2 的行具有相同的值,但“c”列除外。 然后我們將 None 更改為 'cat' 因此預期結果是:

         a     b     c       d
0   banana  rice   mouse   cat
1  coconut  bean   dog     soap
2   banana  rice   mouse   cat
3    apple  soap   apple   rabbit

Quelqu'un à une solution à cette probleme, 謝謝

df.loc[df['c'].isnull(), 'c'] = df[df.duplicated(subset = ['a', 'b'], keep = 'last')]['c'].values

df

Output:

|index|    a    | b  |  c  |  d   |
|-----|---------|----|-----|------|
|  0  | banana  |rice|mouse| cat  |
|  1  | coconut |bean| dog | soap |
|  2  | banana  |rice|mouse| beef |
|  3  | apple   |soap|apple|rabbit|

這段代碼可以解決任意數量的None問題:

In [183]: df = pd.DataFrame(
     ...:         {'a': ['banana', 'coconut', 'banana', 'apple', None],
     ...:          'b': ['rice', 'bean', 'rice', 'soap', 'soap'],
     ...:          'c': ['mouse', 'dog', None, 'apple', 'apple'],
     ...:          'd': ['cat', 'soap', 'cat', 'rabbit', None]}
     ...:     )

In [184]: df
Out[184]: 
         a     b      c       d
0   banana  rice  mouse     cat
1  coconut  bean    dog    soap
2   banana  rice   None     cat
3    apple  soap  apple  rabbit
4     None  soap  apple    None

In [185]: rows = df.isnull().any(axis=1).to_numpy().nonzero()[0] # rows with None
     ...: for i in rows:
     ...:     row = df.iloc[i]
     ...:     cols = df.columns[row.notnull()] # columns without None
     ...:     replacement = (df[cols] == row[cols]).all(axis=1).to_numpy().nonzero()[0]
     ...:     for j in replacement:
     ...:         if i != j:
     ...:             df.loc[i] = df.loc[j]
     ...:             break

In [186]: df
Out[186]: 
         a     b      c       d
0   banana  rice  mouse     cat
1  coconut  bean    dog    soap
2   banana  rice  mouse     cat
3    apple  soap  apple  rabbit
4    apple  soap  apple  rabbit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM