我有一个如下所示的数据帧df1:
Z1 Z2 Z3 Z4
0 0 A A
0 B 0 0
C 0 C 0
D 0 D 0
0 0 E 0
我想制作一个如下所示的新数据框df2:
Z1 Z2 Z3 Z4
C B A A
D C
D
E
为此,我宣布一个空白数据框df2
,其中包含Z1 Z2 Z3 Z4
列
我是在for循环的帮助下这样做的,如下所示:
periods=['Z1', 'Z2', 'Z3', 'Z4']
for i in periods:
for j in range(0,len(df1)):
if df1.loc[j:j,i:i]!=0:
#I want to write such that non zero value will be written in df2
#Like
#df2[something]=df1.loc[j:j,i:i]
但df2
的长度到目前为止为0,因此我无法通过索引访问其单元格,而且我无法理清如何将值放入df2
。< / p>
注意:此问题与标记为重复的问题不同,我的解释同样在评论中
答案 0 :(得分:1)
这是你需要的吗?
df.replace('0',np.nan).apply(lambda x: sorted(x,key=pd.isnull)).dropna(thresh=1).fillna('')
Out[681]:
Z1 Z2 Z3 Z4
0 C B A A
1 D C
2 D
3 E
答案 1 :(得分:1)
您可以使用pd.DataFrame.apply
pd.Series
+列表理解来完成此操作:
df.apply(lambda x: pd.Series([i for i in x if i != '0']))
# Z1 Z2 Z3 Z4
# 0 C B A A
# 1 D NaN C NaN
# 2 NaN NaN D NaN
# 3 NaN NaN E NaN
如果您想要空字符串而不是NaN
,请添加对.fillna
的调用:
df.apply(lambda x: pd.Series([i for i in x if i != '0'])).fillna('')
# Z1 Z2 Z3 Z4
# 0 C B A A
# 1 D C
# 2 D
# 3 E
答案 2 :(得分:1)
这是一种方式。
df = pd.DataFrame({k: pd.Series(list(filter(None, df[k]))) for k in df}).fillna('')
# Z1 Z2 Z3 ZR
# 0 C B A A
# 1 D C
# 2 D
# 3 E
# 4
对于较大的数据帧,这可能比lambda
更有效。