从熊猫中的数据帧派生新数据帧



我有一个数据帧 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.applypd.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 

最新更新