我有一个数据帧 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
。
注意:这个问题与标记为重复的问题不同,我对相同的解释在评论中
这是一种方式。
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
更有效。
这是你需要的吗?
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
您可以通过将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