从pandas中的数据框中获取新的数据帧

时间:2018-02-13 17:05:49

标签: python pandas dataframe

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

注意:此问题与标记为重复的问题不同,我的解释同样在评论中

3 个答案:

答案 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更有效。