簡體   English   中英

將列表添加到 Pandas 中 dataframe 的兩列?

[英]Adding a list to two columns of a dataframe in Pandas?

我有以下代碼。

import pandas as pd 


def generate_list(row): 
    return [row['A']*2, row['B']*3] 

def main(): 
    data = { 
            'A':[0, 2, 3],  
            'B':[4, 15, 6]} 
      
    df = pd.DataFrame(data) 
   
    # applying function to each row in 
    df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1) 
       
if __name__ == '__main__': 
    main() 

該代碼只是將 function 應用於我的 df 的每一行,並將結果作為列表返回。 我正在嘗試將返回列表的每個元素添加到兩個新列中。 但是,我收到以下錯誤:

df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1) 
ValueError: too many values to unpack (expected 2)

代替:

    df['C'], df['D'] = df.apply(lambda row: generate_list(row), axis=1) 

和:

    df[['C','D']] = pd.DataFrame(df.apply(lambda row: generate_list(row), axis=1).tolist(), index= df.index)
    return df

給你:

A   B   C   D
0   0   4   0   12
1   2   15  4   45
2   3   6   6   18

因為apply() function 不能返回一個列表或元組,它只返回一個Series或一個DataFrame ,所以當你只添加一個新列但不添加多個新列時是可以的。 為了您的目的,您可以像這樣使用concat function :

import pandas as pd 

def generate_list(row): 
    return [row['A']*2, row['B']*3] 

def main(): 
    data = { 
            'A':[0, 2, 3],  
            'B':[4, 15, 6]} 
      
    df = pd.DataFrame(data) 
   
    # applying function to each row in 
    df = pd.concat([df, df.apply(lambda row: generate_list(row), axis=1, result_type='expand').rename(columns={0:'C',1:'D'})],axis=1)
    print(df) 
       
if __name__ == '__main__': 
    main() 

上面代碼的結果是:

   A   B  C   D
0  0   4  0  12
1  2  15  4  45
2  3   6  6  18

那是你要的嗎?

我嘗試了一些實驗,例如:

data = {'A':[0, 2, 3],  
        'B':[4, 15, 6]} 
df = pd.DataFrame(data) 
def generate_list(row): 
    return [row['A']*2, row['B']*3] 

obj = df.apply(lambda row: generate_list(row), axis=1)

    0    [0.0, 12.0]
    1    [4.0, 45.0]
    2    [6.0, 18.0]
    dtype: object

obj_accept = np.array(obj.sum()).reshape(-1,2)

    array([[ 0., 12.],
           [ 4., 45.],
           [ 6., 18.]])

# it's worked
df[['C', 'D']] = obj_accept

# also work
df[['C', 'D']] = np.array(obj.tolist())

# also work
df[['C', 'D']] = obj.tolist()

# not worked
df[['C', 'D']] = obj

形狀:

obj.values.shape              # (3,)
df[['C', 'D']].shape          # (3, 2)
np.array(obj.tolist()).shape  # (3, 2)

一些奇怪的結果:

df = pd.DataFrame({'A':[0, 2, 3], 'B':[4, 15, 6]} ) 
df.loc[:1, ['C', 'D']] = obj.loc[:1]
print(obj.loc[:1])

    0    [0.0, 12.0]
    1    [4.0, 45.0]
    dtype: object

print(df)

       A   B     C     D
    0  0   4   0.0   4.0
    1  2  15  12.0  45.0
    2  3   6   NaN   NaN

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM