[英]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.