簡體   English   中英

用熊貓中的列平均值替換數據框中的特定值

[英]Replace specific values in a dataframe by column mean in pandas

我是一個 python 初學者,我正在嘗試對我通常用 R 語言做的數據幀進行一些操作。

我有一個包含 2592 行和 205 列的大型數據框,我想將 0.0 值替換為其列最小值的一半。

帶有隨機數據框的示例是:

>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(1)
>>> df = pd.DataFrame(np.random.randint(0,10, size=(3,5)), columns = ['A', 'B', 'C', 'D', 'E'])
>>> print(df)
   A  B  C  D  E
0  5  8  9  5  0
1  0  1  7  6  9
2  2  4  5  2  4

我正在尋找的結果是:

   A  B  C  D  E
0  5  8  9  5  2
1  1  1  7  6  9
2  2  4  5  2  4

直覺上我會這樣做:

>>> for column in df:
        for element in column:
            if element == 0:
                element = df[column].min()/2

但它不起作用......有什么幫助嗎?

謝謝!

使用DataFrame.mask替換沒有0除以2的最小值:

df1 = df.mask(df.eq(0), df.replace(0, np.nan).min().div(2), axis=1)
print(df1)
   A  B  C  D  E
0  5  8  9  5  2
1  1  1  7  6  9
2  2  4  5  2  4

可以使用更有效的解決方案(感謝@mozway):

m = df.eq(0) 
df1 = df.mask(m, df[~m].min().div(2), axis=1)

要以您的“直覺”方式工作,這就是如何做到的。

使用函數來執行您需要的奇特邏輯。 Pandas 的 .apply 功能已經過優化,所以無論如何它應該足夠快。

import pandas as pd
import numpy as np
np.random.seed(1)
df = pd.DataFrame(np.random.randint(0,10, size=(3,5)), columns = ['A', 'B', 'C', 'D', 'E'])

def make_half_minimum(value, dataseries):
    if value == 0:
        dataseries_ = dataseries[dataseries!=0]
        return dataseries_.min()/2
    else:
        return value

for column_name in df.columns:
    df[column_name] = df[column_name].apply(lambda x: make_half_minimum(x,df[column_name]))

print(df)
     A  B  C  D    E
0  5.0  8  9  5  2.0
1  1.0  1  7  6  9.0
2  2.0  4  5  2  4.0
[Finished in 521ms]

暫無
暫無

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

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