Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1
Posted
技术标签:
【中文标题】Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1【英文标题】:Python Pandas: if the data is NaN, then change to be 0, else change to be 1 in data frame 【发布时间】:2016-12-01 03:14:11 【问题描述】:我有一个 DataFrame:df 如下:
row id name age url
1 e1 tom NaN http1
2 e2 john 25 NaN
3 e3 lucy NaN http3
4 e4 tick 29 NaN
我想在列中将 NaN 更改为 0,否则为 1:年龄、url。 我的代码如下,但它是错误的。
import Pandas as pd
df[['age', 'url']].applymap(lambda x: 0 if x=='NaN' else x)
我想得到以下结果:
row id name age url
1 e1 tom 0 1
2 e2 john 1 0
3 e3 lucy 0 1
4 e4 tick 1 0
感谢您的帮助!
【问题讨论】:
【参考方案1】:您可以使用where
和fillna
和isnull
条件:
df[['age', 'url']] = df[['age', 'url']].where(df[['age', 'url']].isnull(), 1)
.fillna(0).astype(int)
print (df)
row id name age url
0 1 e1 tom 0 1
1 2 e2 john 1 0
2 3 e3 lucy 0 1
3 4 e4 tick 1 0
或者numpy.where
和isnull
:
df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1)
print (df)
row id name age url
0 1 e1 tom 0 1
1 2 e2 john 1 0
2 3 e3 lucy 0 1
3 4 e4 tick 1 0
notnull
和 astype
的最快解决方案:
df[['age', 'url']] = df[['age', 'url']].notnull().astype(int)
print (df)
row id name age url
0 1 e1 tom 0 1
1 2 e2 john 1 0
2 3 e3 lucy 0 1
3 4 e4 tick 1 0
编辑:
我尝试修改您的解决方案:
df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1)
print (df)
row id name age url
0 1 e1 tom 0 1
1 2 e2 john 1 0
2 3 e3 lucy 0 1
3 4 e4 tick 1 0
时间安排:
len(df)=4k
:
In [127]: %timeit df[['age', 'url']] = df[['age', 'url']].applymap(lambda x: 0 if pd.isnull(x) else 1)
100 loops, best of 3: 11.2 ms per loop
In [128]: %timeit df[['age', 'url']] = np.where(df[['age', 'url']].isnull(), 0, 1)
100 loops, best of 3: 2.69 ms per loop
In [129]: %timeit df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0)
100 loops, best of 3: 2.78 ms per loop
In [131]: %timeit df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1
1000 loops, best of 3: 1.45 ms per loop
In [136]: %timeit df[['age', 'url']] = df[['age', 'url']].notnull().astype(int)
1000 loops, best of 3: 1.01 ms per loop
【讨论】:
感谢您的友好回答。我明天会根据投票接受它。 你帮了我很大的忙。其实数据框是一个大数据框,速度对我来说很重要! 那么piRSquared
解决方案是最快的。
我找到了更快的解决方案piRSquared
,请查看最后的编辑。
你是最热情和最善良的,有时不仅仅是基于最佳答案。现在,我接受你!祝你好运!【参考方案2】:
使用np.where
和pd.notnull
分别用0
和1
替换缺失和有效的元素:
In [90]:
df[['age', 'url']] = np.where(pd.notnull(df[['age', 'url']]), 1, 0)
df
Out[90]:
row id name age url
0 1 e1 tom 0 1
1 2 e2 john 1 0
2 3 e3 lucy 0 1
3 4 e4 tick 1 0
【讨论】:
【参考方案3】:df.loc[:, ['age', 'url']] = df[['age', 'url']].notnull() * 1
df
【讨论】:
以上是关于Python Pandas:如果数据为NaN,则更改为0,否则在数据框中更改为1的主要内容,如果未能解决你的问题,请参考以下文章
仅在特定条件下将 NaN 替换为“-”符号,Python-Pandas
python 值比较判断,np.nan is np.nan 却 np.nan != np.nan ,pandas 单个数据框值判断nan