2017-03-15 171 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