Python 如何选择一个非空值将多个系列合并为一个系列?
我在一个数据帧(5000000x100)中有三列,它们是稀疏的非空值(非空值是货币代码): 我还有一本关于欧元兑换率的词典,如:Python 如何选择一个非空值将多个系列合并为一个系列?,python,pandas,Python,Pandas,我在一个数据帧(5000000x100)中有三列,它们是稀疏的非空值(非空值是货币代码): 我还有一本关于欧元兑换率的词典,如: {'USD':0.8499 , 'EUR': 1 , 'GBP': 1.135} 我希望为每一行创建另一列,其中包含相应的转换率(我们可以假设一行只包含单一货币的实例),例如: 我可以通过使用map实现单个列的预期结果。例如: res = s.map(conversion_rate_dictionary) 举个小例子: s res NaN NaN EUR
{'USD':0.8499 , 'EUR': 1 , 'GBP': 1.135}
我希望为每一行创建另一列,其中包含相应的转换率(我们可以假设一行只包含单一货币的实例),例如:
我可以通过使用map实现单个列的预期结果。例如:
res = s.map(conversion_rate_dictionary)
举个小例子:
s res
NaN NaN
EUR 1
GBP 1.135
USD 0.849
NaN NaN
如何直接或通过在每列上组合map的结果来获得所需的结果,我感到困惑。感谢您的建议使用ffill
进行正向填充NaN
s,然后通过以下方式选择最后一列:
详情:
print (df.replace(d).ffill(axis=1))
a b c
0 NaN 1.0000 1.0000
1 NaN NaN NaN
2 NaN NaN NaN
3 1.0000 1.0000 1.0000
4 NaN NaN NaN
5 NaN NaN NaN
6 NaN 1.1350 1.1350
7 NaN NaN NaN
8 NaN NaN NaN
9 0.8499 0.8499 0.8499
10 NaN NaN NaN
11 NaN NaN NaN
12 NaN NaN NaN
13 NaN 1.0000 1.0000
Numpy解决方案在大型数据帧中速度更快:
d = {'USD':0.8499 , 'EUR': 1 , 'GBP': 1.135}
a = df.replace(d).values
m = ~np.isnan(a)
b = a[np.arange(m.shape[0]), m.shape[1]-m[:,::-1].argmax(1)-1]
print (b)
[ 1. nan nan 1. nan nan 1.135 nan nan
0.8499 nan nan nan 1. ]
df['new'] = b
print (df)
a b c new
0 NaN EUR EUR 1.0000
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 EUR NaN NaN 1.0000
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN GBP NaN 1.1350
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 USD NaN NaN 0.8499
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
12 NaN NaN NaN NaN
13 NaN EUR EUR 1.0000
谢谢你提供的详细解决方案,jez,我明天会好好看一看,试着理解它和所有涉及的功能,并一定会接受它或要求澄清…numpy解决方案让我困惑,但我想我只需要修补一切来解决它,很难想象,不过,这个解决方案是可以理解的。非常感谢你。
d = {'USD':0.8499 , 'EUR': 1 , 'GBP': 1.135}
df['new'] = df.replace(d).ffill(axis=1).iloc[:, -1]
print (df)
a b c new
0 NaN EUR EUR 1.0000
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 EUR NaN NaN 1.0000
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN GBP NaN 1.1350
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 USD NaN NaN 0.8499
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
12 NaN NaN NaN NaN
13 NaN EUR EUR 1.0000
print (df.replace(d).ffill(axis=1))
a b c
0 NaN 1.0000 1.0000
1 NaN NaN NaN
2 NaN NaN NaN
3 1.0000 1.0000 1.0000
4 NaN NaN NaN
5 NaN NaN NaN
6 NaN 1.1350 1.1350
7 NaN NaN NaN
8 NaN NaN NaN
9 0.8499 0.8499 0.8499
10 NaN NaN NaN
11 NaN NaN NaN
12 NaN NaN NaN
13 NaN 1.0000 1.0000
d = {'USD':0.8499 , 'EUR': 1 , 'GBP': 1.135}
a = df.replace(d).values
m = ~np.isnan(a)
b = a[np.arange(m.shape[0]), m.shape[1]-m[:,::-1].argmax(1)-1]
print (b)
[ 1. nan nan 1. nan nan 1.135 nan nan
0.8499 nan nan nan 1. ]
df['new'] = b
print (df)
a b c new
0 NaN EUR EUR 1.0000
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 EUR NaN NaN 1.0000
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN GBP NaN 1.1350
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 USD NaN NaN 0.8499
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
12 NaN NaN NaN NaN
13 NaN EUR EUR 1.0000