我正在尝试在pandas DataFrame中连接两个列。问题是,当任一系列中存在None值时,结果为NaN。
由于实际数据非常庞大,并且需要保留原始的None值以供以后参考,因此我希望不更改列中的原始值即可实现此操作。在pandas中有没有一种方法可以实现这一点呢?
创建示例DataFrame的代码如下:
我的问题是,pandas是否支持更优雅/简单的方法来实现这一点?
创建示例DataFrame的代码如下:
import pandas as pd
f = pd.DataFrame([['a', 'b','c','a', 'b','c'],['1', '2','3', '4', '5','6', ]])
f = f.transpose()
f.columns = ['xx', 'yy']
f.xx[0] = None
f.yy[0] = None
f.xx[2] = None
f.yy[3] = None
xx yy
0 None None
1 b 2
2 None 3
3 a None
4 b 5
5 c 6
我尝试了 f['new_str'] = f.xx + f.yy
和 f['new_str'] = f['xx'] + f['yy']
。如果任意一个值是 None 类型,则两者都会将连接的值设置为 NaN。我认为这是因为 Pandas 处理 None 类型的方式导致的。None 类型和 str 类型不能通过 '+' 运算符进行 "相加"。
xx yy new_str
0 None None NaN
1 b 2 b2
2 None 3 NaN
3 a None NaN
4 b 5 b5
5 c 6 c6
我想要做的是:
f['new_str'] = f.xx.map(lambda x: '')
for idx, arow in f.iterrows():
con = ''
if arow.xx:
con += arow.xx
if arow.yy:
con += arow.yy
f.loc[idx,'new_str'] = con
f
xx yy new_str
0 None None
1 b 2 b2
2 None 3 3
3 a None a
4 b 5 b5
5 c 6 c6
我的问题是,pandas是否支持更优雅/简单的方法来实现这一点?
f.apply(lambda row: (row['xx'] or '') + (row['yy'] or ''),axis=1)
- Liam Foleyxx
或yy
列中的值,因为它们没有被赋值在左侧。fillna
在数据的副本上工作。 - pneumatics