Pandas-连接两列字符串列表

问题描述 投票:0回答:4

我有一个来自数据库的有趣的数据框。数据框有两列,它们是字符串列表。我需要合并这两个列表中的值,以创建一个新的列表列。例如:

data = [ 
    {'id': 1, 'l1': ['Luke', 'Han'], 'l2': ['Skywalker', 'Solo']}, 
    {'id': 2, 'l1': ['Darth', 'Kylo'], 'l2': ['Vader', 'Ren']},
    {'id': 3, 'l1': [], 'l2': []}
]                                                                                                                                                                
df = pd.DataFrame(data)   

注意,第三行没有值。您还可以假定l1l2的长度相同。我需要合并l1和l2中的值(之间有一个空格),例如:]

result = [
    {'id': 1, 'name': ['Luke Skywalker', 'Han Solo']},
    {'id': 2, 'name': ['Darth Vader', 'Kylo Ren']},
    {'id': 3, 'name': []}
]
result_df = pd.DataFrame(result)
python string pandas list concat
4个回答
1
投票

例如,您将dict comprehension' '.joinzip结合使用以遍历数据集,例如,此:

import pandas as pd


data = [ 
    {'id': 1, 'l1': ['Luke', 'Han'], 'l2': ['Skywalker', 'Solo']}, 
    {'id': 2, 'l1': ['Darth', 'Kylo'], 'l2': ['Vader', 'Ren']},
    {'id': 3, 'l1': [], 'l2': []}
]                                                                                                                                                                
df = pd.DataFrame(data) 

result = [
    {
        'id': row['id'], 
        'name': [' '.join(l1_l2) for l1_l2 in zip(row['l1'], row['l2'])]
    } for row in data
]

print(pd.DataFrame(result))
>>>
   id                        name
0   1  [Luke Skywalker, Han Solo]
1   2     [Darth Vader, Kylo Ren]
2   3                          []

0
投票
names = [[' '.join(name) for name in zip(t1, t2)] 
         for t1, t2 in df[['l1', 'l2']].values]
result_df = df[['id']].assign(name=names)
>>> result_df
   id                        name
0   1  [Luke Skywalker, Han Solo]
1   2     [Darth Vader, Kylo Ren]
2   3                          []

0
投票

Series.explode用于Series.explode

pandas> 0.25.0

输出

df[['id']].join(df['l1'].explode()
                       .str.cat(df['l2'].explode(), ' ')
                       .fillna('')
                       .groupby(level = 0)
                       .agg(list)
                       .rename('Name'))

0
投票

我为最后一刻看上去令人讨厌的代码而深表歉意。但这应该可以带您到想要的地方:假设您只有两列(如果您还有更多列,只需添加其中的''+ df.iloc [j,3&or 4&or ...] [i]),希望对您有所帮助!

   id                        Name
0   1  [Luke Skywalker, Han Solo]
1   2     [Darth Vader, Kylo Ren]
2   3                          []
© www.soinside.com 2019 - 2024. All rights reserved.