Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何选择一个非空值将多个系列合并为一个系列?_Python_Pandas - Fatal编程技术网

Python 如何选择一个非空值将多个系列合并为一个系列?

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

我在一个数据帧(5000000x100)中有三列,它们是稀疏的非空值(非空值是货币代码):

我还有一本关于欧元兑换率的词典,如:

{'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