我有一个如下所示的 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/