gpt4 book ai didi

python - R 脚本到 Python 代码

转载 作者:行者123 更新时间:2023-12-01 01:46:56 32 4
gpt4 key购买 nike

我开始深入研究 Python,但在将一些 R 脚本转换为 Python 时遇到问题。我在 R 中定义了一个函数:

Shft_Rw <- function(x) { for (row in 1:nrow(x))
{
new_row = x[row , c(which(!is.na(x[row, ])), which(is.na( x[row, ])))]
colnames(new_row) = colnames(x)
x[row, ] = new_row
}
return(x)
}

这本质上是获取数据帧中每行的前导 NA 并将它们放在行的末尾,即

import pandas as pd
import numpy as np
df =pd.DataFrame({'a':[np.nan,np.nan,3],'b':[3,np.nan,5],'c':[3, 4,5]})

df
Out[156]:
a b c
0 NaN 3.0 3
1 NaN NaN 4
2 3.0 5.0 5

变成:

df2 =pd.DataFrame({'a':[3,4,3],'b':[3,np.nan,5],'c':[np.nan, np.nan,5]})
df2
Out[157]:
a b c
0 3 3.0 NaN
1 4 NaN NaN
2 3 5.0 5.0

到目前为止我已经:

def Shft_Rw(x):
for row in np.arange(0,x.shape[0]):
new_row = x.iloc[row,[np.where(pd.notnull(x.iloc[row])),np.where(pd.isnull(df.iloc[row]))]]

但是抛出错误。使用上面的示例 df,我可以使用 iloc 获取行索引以及为空/非空的列位置(使用 where()),但无法将两者放在一起(尝试了更多括号等的多种变体)。

df.iloc[1]
Out[170]:
a NaN
b NaN
c 4.0

np.where(pd.isnull(df.iloc[1]))
In[167] : np.where(pd.isnull(df.iloc[1]))
Out[167]: (array([0, 1], dtype=int64),)

df.iloc[1,np.where(pd.notnull(df.iloc[1]))]

有人能够帮助复制该功能和/或展示更有效的方法来解决问题吗?

谢谢!

最佳答案

使用applydropna :

df1 = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)
df1.columns = df.columns
print (df1)
a b c
0 3.0 3.0 NaN
1 4.0 NaN NaN
2 3.0 5.0 5.0

如果性能很重要,我建议使用这个完美的 justify function :

arr = justify(df.values, invalid_val=np.nan, axis=1, side='left')
df1 = pd.DataFrame(arr, index=df.index, columns=df.columns)
print (df1)
a b c
0 3.0 3.0 NaN
1 4.0 NaN NaN
2 3.0 5.0 5.0

关于python - R 脚本到 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51226840/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com