我有以下代码:
sample_data = OrderedDict((df.name, df['col'].sample(n=3)) for df in test_cases[1:])
sample = pd.DataFrame(sample_data)
其中提供以下数据框:
col1 col2
A NaN
P NaN
NaN E
NaN R
U NaN
NaN Y
如何获取以下数据框:
col1 col2
A E
P R
U Y
答案 0 :(得分:2)
另一种可能的解决方案是使用 dropna() , reset_index() 和 concat() 。
pd.concat([df[x].dropna().reset_index(drop=True) for x in df.columns], axis=1)
代码
import pandas as pd
import numpy as np
li=[['A',np.nan],['P',np.nan],[np.nan,'E'],[np.nan,'R'],['U',np.nan],[np.nan,'Y']]
df=pd.DataFrame(li,columns=['col1','col2'])
df2=pd.concat([df[x].dropna().reset_index(drop=True) for x in df.columns], axis=1)
print(df2)
输出
col1 col2
0 A E
1 P R
2 U Y
答案 1 :(得分:1)
您可以使用列表推导找到非空值并重建数据框,
pd.DataFrame([df.loc[df[col].notna(), col].values for col in df.columns]).T
0 1
0 A E
1 P R
2 U Y
或
a = np.array([df.loc[df[col].notna(), col].values for col in df.columns]).T
pd.DataFrame(a, columns = df.columns)
col1 col2
0 A E
1 P R
2 U Y
答案 2 :(得分:0)
IIUC
df.apply(lambda x : sorted(x,key=pd.isnull)).dropna()
Out[485]:
col1 col2
0 A E
1 P R
2 U Y
如果性能很重要,请检查justify