我想在Pandas数据帧中找到包含空格(任意数量)的所有值,并用NaN替换这些值.
有什么想法可以改进吗?
基本上我想转此:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Run Code Online (Sandbox Code Playgroud)
进入:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Run Code Online (Sandbox Code Playgroud)
我已经设法用下面的代码来做,但是男人是丑陋的.它不是Pythonic,我敢肯定它也不是最有效的熊猫用途.我循环遍历每一列并对通过应用对每个值进行正则表达式搜索的函数生成的列掩码进行布尔替换,并在空格上进行匹配.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Run Code Online (Sandbox Code Playgroud)
只需迭代可能包含空字符串的字段,就可以对其进行优化:
if df[i].dtype == np.dtype('object')
Run Code Online (Sandbox Code Playgroud)
但这并没有太大的改善
最后,这段代码将目标字符串设置为None,它与Pandas的函数一样工作fillna(),但如果我能NaN直接插入一个而不是完整性,那么它对于完整性会很好None …
我正在尝试基于两列创建新列.假设我想创建一个新的列z,它应该是y的值,当它没有丢失时,并且当y确实缺失时是x的值.所以在这种情况下,我希望z是[1, 8, 10, 8].
x y
0 1 NaN
1 2 8
2 4 10
3 8 NaN
Run Code Online (Sandbox Code Playgroud) 这两个功能似乎与我相同.您可以看到它们在下面的代码中实现了相同的目标,因为列c和d相等.那我什么时候应该使用另一个呢?
这是一个例子:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 10, size=(10, 2)), columns=list('ab'))
df.loc[::2, 'a'] = np.nan
Run Code Online (Sandbox Code Playgroud)
返回:
a b
0 NaN 4
1 2.0 6
2 NaN 8
3 0.0 4
4 NaN 4
5 0.0 8
6 NaN 7
7 2.0 2
8 NaN 9
9 7.0 2
Run Code Online (Sandbox Code Playgroud)
这是我的出发点.现在我将添加两列,一列使用combine_first,另一列使用fillna,它们将产生相同的结果:
df['c'] = df.a.combine_first(df.b)
df['d'] = df['a'].fillna(df['b'])
Run Code Online (Sandbox Code Playgroud)
返回:
a b c d
0 NaN 4 4.0 4.0
1 8.0 7 8.0 8.0
2 NaN 2 2.0 …Run Code Online (Sandbox Code Playgroud) 给定以下数据框df,其中df['B']=df['M1']+df['M2']:
A M1 M2 B
1 1 2 3
1 2 NaN NaN
1 3 6 9
1 4 8 12
1 NaN 10 NaN
1 6 12 18
Run Code Online (Sandbox Code Playgroud)
我希望NaNin列B等于in 的相应值,M1或者M2前提是后者不是NaN:
A M1 M2 B
1 1 2 3
1 2 NaN 2
1 3 6 9
1 4 8 12
1 NaN 10 10
1 6 12 18
Run Code Online (Sandbox Code Playgroud)
建议使用以下答案:
df.loc[df['B'].isnull(),'B'] = df['M1'],但此行的结构允许同时考虑 …