In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1],
'c': ['foo', 'goo', 'bar']})
In [3]: df
Out[3]:
a b c
0 0 -3 foo
1 -1 2 goo
2 2 1 bar
In [4]: num = df._get_numeric_data()
In [5]: num[num < 0] = 0
In [6]: df
Out[6]:
a b c
0 0 0 foo
1 0 2 goo
2 2 1 bar
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
...: 'b': pd.to_timedelta([-3, 2, 1], 'd')})
In [3]: df
Out[3]:
a b
0 0 days -3 days
1 -1 days 2 days
2 2 days 1 days
In [4]: for k, v in df.iteritems():
...: v[v < 0] = 0
...:
In [5]: df
Out[5]:
a b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days
**更新:**与pd.Timedelta的比较适用于整个DataFrame:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
...: 'b': pd.to_timedelta([-3, 2, 1], 'd')})
In [3]: df[df < pd.Timedelta(0)] = 0
In [4]: df
Out[4]:
a b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days
9条答案
按热度按时间ozxc1zmp1#
如果所有列都是数值型的,你可以使用布尔型索引:
对于更一般的情况,this answer显示了私有方法
_get_numeric_data
:使用
timedelta
类型,布尔索引似乎对单独的列有效,但对整个 Dataframe 无效。因此,您可以:**更新:**与
pd.Timedelta
的比较适用于整个DataFrame:xriantvc2#
另一种简洁的方法是pandas.DataFrame.clip。
例如:
xsuvu9jc3#
我发现另一个有用的干净选项是pandas.DataFrame.mask,它将“替换条件为真的值”
创建DataFrame:
将负数替换为0:
或者,将负数替换为NaN,我经常需要它:
ercv8c1e4#
你可以这样使用
pandas.where(args)
:aiqt4smr5#
使用lambda函数
ekqde3dh6#
如果你正在处理一个大的df(在我的例子中是40m x 700),它可以更快地工作,并且通过对列的迭代来节省内存,比如。
odopli947#
对现有答案稍作修改。
让我们识别所有数值列,并创建一个包含所有数值的数据框。然后在新的 Dataframe 中用NaN替换负值
现在,删除主数据框中处理负值的列,然后将新列值连接到主数据框
zz2j4svz8#
如果你有一个混合数据类型的数据集,也可以考虑将非数字数据移动到索引中,更新数据,然后删除索引:
由于某些原因,使用
_get_numeric_data()
的方法对我不起作用。8ljdwjyq9#
试试这个:
要避免出现不可预测的行为,请执行以下操作:返回视图与副本