python - 如何从另一个数据帧中选择非空行并随机获取其索引

标签 python pandas

我有一个如下所示的 pandas 数据框:

name of dataframe : ZA
             AB        AC        AF
    A1  1.764052  0.400157  0.978738
    B1       NaN  0.400157  0.400157

我想稍后添加每个非空列中随机行的索引。

这是代码:

list = ['AB','AC','AF']

info_s =   pd.DataFrame(columns=['X'],index = list)

for app in list:
    if app in ZA.columns:
        ele = ZA.dropna(how='all') #didn't work  
        ele1=ele.loc[:,app].take(np.random.permutation(len(ele.index))[:1]) 
        ind = ele1.index
        info_s.loc[app, 'X'] = ind
    else:
        info_s.loc[app, 'X'] = None

输出:

Index        X
AB          Only A1
AC          A1 or B1
AF          A1 or B1

最佳答案

IIUC 编辑:

ZA.notnull().apply(lambda x:np.random.choice(x[x].index)).reset_index().rename(columns={0:'X'})

输出:

  index   X
0    AB  A1
1    AC  B1
2    AF  A1

您不需要列表,也不需要 for 循环,这一行就可以了:

说明

使用 notnull 转换为 bool 值,然后应用 lambda 函数连接索引中 bool 值为 true 的所有值。在 Pandas 系列中,如果 x 是 bool 值,则 x[x] 将返回那些正索引和值。

ZA.notnull().apply(lambda x: ' or '.join(x[x].index))

输出:

AB          A1
AC    A1 or B1
AF    A1 or B1
dtype: object

并且您可以执行一些内务重命名列、reset_index 等...

ZA.notnull().apply(lambda x: ' or '.join(x[x].index)).reset_index().rename(columns={0:'X'})

输出:

  index         X
0    AB        A1
1    AC  A1 or B1
2    AF  A1 or B1

关于python - 如何从另一个数据帧中选择非空行并随机获取其索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44139026/

相关文章:

Python Numpy : Operation on each sequential element without for loop?

python - Kivy 不工作(错误 : Unable to find any valuable Window provider.)

python - 如何在 python 中更改数据框中的列值?

Python Pandas csv import "Error tokenizing data"- 显示错误行内容

python - 如何防止同一台电脑中的麦克风到扬声器的回送回声

python - 按索引向后切片字符串

python - Pandas 条形图总是创建一个空的子图

python - 使用其他系列对象的最大值创建系列对象

python - 带有多行标题 xls 文件的 Pandas read_csv

python - 将 pandas DataFrame 从函数中提取到全局变量