Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从系列中提取不同长度的行值到新列?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何从系列中提取不同长度的行值到新列?

Python 如何从系列中提取不同长度的行值到新列?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个带有系列C的熊猫数据帧,其中每个值都是一个列表。由于每个列表的长度不同,如何将此序列切片并附加到此数据帧的新列中 其他发现:以[,and',开头的每个字母都被添加到整个列表中(包括空格以分隔单词) 我应该如何将字母组合成一个单词,然后应用解决方案 样本df- id A B C 0 1 2 ['Alan', 'Rod', 'Ben'] 1 1 3 ['Jeff']

假设我有一个带有系列C的熊猫数据帧,其中每个值都是一个列表。由于每个列表的长度不同,如何将此序列切片并附加到此数据帧的新列中

其他发现:以[,and',开头的每个字母都被添加到整个列表中(包括空格以分隔单词)

我应该如何将字母组合成一个单词,然后应用解决方案

样本df-

id   A     B    C                       
0    1     2    ['Alan', 'Rod', 'Ben']  
1    1     3    ['Jeff']                  
2    4     6    ['Pete', 'Joe']  
id   A     B    C                       N1   N2   N3  N4  ....
0    1     2    ['Alan', 'Rod', 'Ben']  [    '    A   l
1    1     3    ['Jeff']                [    '    J   e
2    4     6    ['Pete', 'Joe']         [    '    P   e
id   A     B    C                        N1     N2      N3  
0    1     2    ['Alan', 'Rod', 'Ben']  'Alan'  'Rod'   'Ben'   
1    1     3    ['Jeff']                'Jeff'   Nan     Nan   
2    4     6    ['Pete', 'Joe']         'Pete'   'Joe'   Nan
中间df-

id   A     B    C                       
0    1     2    ['Alan', 'Rod', 'Ben']  
1    1     3    ['Jeff']                  
2    4     6    ['Pete', 'Joe']  
id   A     B    C                       N1   N2   N3  N4  ....
0    1     2    ['Alan', 'Rod', 'Ben']  [    '    A   l
1    1     3    ['Jeff']                [    '    J   e
2    4     6    ['Pete', 'Joe']         [    '    P   e
id   A     B    C                        N1     N2      N3  
0    1     2    ['Alan', 'Rod', 'Ben']  'Alan'  'Rod'   'Ben'   
1    1     3    ['Jeff']                'Jeff'   Nan     Nan   
2    4     6    ['Pete', 'Joe']         'Pete'   'Joe'   Nan
预期df-

id   A     B    C                       
0    1     2    ['Alan', 'Rod', 'Ben']  
1    1     3    ['Jeff']                  
2    4     6    ['Pete', 'Joe']  
id   A     B    C                       N1   N2   N3  N4  ....
0    1     2    ['Alan', 'Rod', 'Ben']  [    '    A   l
1    1     3    ['Jeff']                [    '    J   e
2    4     6    ['Pete', 'Joe']         [    '    P   e
id   A     B    C                        N1     N2      N3  
0    1     2    ['Alan', 'Rod', 'Ben']  'Alan'  'Rod'   'Ben'   
1    1     3    ['Jeff']                'Jeff'   Nan     Nan   
2    4     6    ['Pete', 'Joe']         'Pete'   'Joe'   Nan

将序列转换为列表,这样您就有了列表列表,然后使用pandas.dataframe(listoflists)将其转换为数据帧。然后您可以将新的数据帧附加或合并到旧的数据帧。

解决方案是的一个大大简化的版本。只需将长度不等的列表放入
pd.dataframe()
constructor,新列数将自动确定

df.join(pd.DataFrame(df["C"].apply(pd.Series))).rename(columns={0:"N1",1:"N2",2:"N3"})

   A  B                 C    N1   N2   N3
0  1  2  [Alan, Rod, Ben]  Alan  Rod  Ben
1  1  3            [Jeff]  Jeff  NaN  NaN
2  4  6       [Pete, Joe]  Pete  Joe  NaN
import pandas as pd
import numpy as np

df = pd.DataFrame(
    [[1, 2,['Alan', 'Rod', 'Ben']],
     [1, 3,['Jeff']],
     [4, 6,['Pete', 'Joe']]],
    columns=['A', 'B','C']
)

# 1. unpack and reconstruct a dataframe   
df_unpack = pd.DataFrame(df["C"].to_list())
# optional: None to NaN
# df_unpack.fillna(np.nan)    

print(df_unpack)
      0     1     2
0  Alan   Rod   Ben
1  Jeff  None  None
2  Pete   Joe  None

# 2. concatenate the results
df_out = pd.concat([df, df_unpack], axis=1)

# 3. determine names
df_out.index.name = "id"
df_out.columns = ['A','B','C'] + [f"N{i+1}" for i in range(df_unpack.shape[1])]

print(df_out)
    A  B                 C    N1    N2    N3
id                                          
0   1  2  [Alan, Rod, Ben]  Alan   Rod   Ben
1   1  3            [Jeff]  Jeff  None  None
2   4  6       [Pete, Joe]  Pete   Joe  None

迭代项目并创建新列:

newdf = pd.DataFrame();
for i , row in df.iterrows():
    for j in range(len(row['C'])):
        row['ncol{}'.format(j)] = row['C'][j]
    newdf = newdf.append(row,ignore_index=True)

感谢@MhDG7对这个问题的初步思考。我刚刚发现这个列表是通过添加字母创建的。你能解释一下吗?如果列表是通过添加包含特殊字符的字母来构建的?(即,.\')@Bill Huang1)
df[[f“N{I+1}”表示范围(4)内的I)]。apply(lambda行):.join(行),axis=1)
可以将字符连接在一起。2)但将列表的
字符串表示形式转换为
列表将非常危险。是的,我知道有
ast.literal\u eval(str\u list)
用于此目的(请参阅)。但我不确定它是否足够安全,不受特殊字符和引号的影响。3)我进一步建议您,如果可能的话,首先避免生成这样一个会引起麻烦的数据结构。