2017-03-15 82 views
1

假设有一个pandas.DataFrame,如:检索大熊猫数据帧列的列表元素

pd.DataFrame([[np.nan,np.nan],[[1,2],[3,4]],[[11,22],[33,44]]],columns=['A','B']) 

什么是产生2 pandas.DataFrames每个包含在框架从每一个值列表中的第一个和第二个元素(NAN如果最简单的方法该职位是南)。

pd.DataFrame([[np.nan,np.nan],[1,3],[11,33]],columns=['A','B']) 
pd.DataFrame([[np.nan,np.nan],[2,4],[22,44]],columns=['A','B']) 

回答

1

您可以使用:

#replace NaN to [] - a bit hack 
df = df.mask(df.isnull(), pd.Series([[]] * len(df.columns), index=df.columns), axis=1) 
print (df) 
      A   B 
0  []  [] 
1 [1, 2] [3, 4] 
2 [11, 22] [33, 44] 

#create new df by each column, concanecate together 
df3 = pd.concat([pd.DataFrame(df[col].values.tolist()) for col in df], 
       axis=1, 
       keys=df.columns) 
print (df3) 
     A   B  
     0  1  0  1 
0 NaN NaN NaN NaN 
1 1.0 2.0 3.0 4.0 
2 11.0 22.0 33.0 44.0 

#select by xs 
df1 = df3.xs(0, level=1, axis=1) 
print (df1) 
     A  B 
0 NaN NaN 
1 1.0 3.0 
2 11.0 33.0 

df2 = df3.xs(1, level=1, axis=1) 
print (df2) 
     A  B 
0 NaN NaN 
1 2.0 4.0 
2 22.0 44.0 
0

你可以做你需要返回每列n'th元素的功能是什么。

代码:

def row_element(elem_num): 
    def func(row): 
     ret = [] 
     for item in row: 
      try: 
       ret.append(item[elem_num]) 
      except: 
       ret.append(item) 
     return ret 
    return func 

测试代码:

df = pd.DataFrame(
    [[np.nan, np.nan], [[1, 2], [3, 4]], [[11, 22], [33, 44]]], 
    columns=['A', 'B']) 

print(df) 
print(df.apply(row_element(0), axis=1)) 
print(df.apply(row_element(1), axis=1)) 

结果:

  A   B 
0  NaN  NaN 
1 [1, 2] [3, 4] 
2 [11, 22] [33, 44] 

     A  B 
0 NaN NaN 
1 1.0 3.0 
2 11.0 33.0 

     A  B 
0 NaN NaN 
1 2.0 4.0 
2 22.0 44.0