Pandas 将长字符串列动态操作为 2 列的数据框
Pandas dataframe manipulating with long string column to 2 columns dynamically
我有数据框:
id
问候姓名
1
你好+彼得|再见+约翰
2
hi+cheff|gutentag+rudolf|goodafternoon+Alex
我想要
id
问候语
姓名
1
你好
彼得
1
再见
约翰
2
嗨
厨师
2
gutentag
鲁道夫
2
下午好
亚历克斯
我不知道如何动态拆分列 greetingsname,以获得我想要的,因为列 greetingsname 具有不同的字符串长度。但是分隔符分布保持不变greeting DELIMETER(+) name DELIMETER(|) greeting DELIMETER(+) name
从这个意义上说,它可以有不同的长度(几个名字和问候语,在另一列中有不同数量的名字和问候语)
感谢
我们可以试试extractall
df.set_index('id')['greetingsname']\
.str.extractall(r'(?P<greeting>[^+|]+)\+(?P<name>[^|]+)').droplevel(1)
greeting name
id
1 hello peter
1 goodbye john
2 hi cheff
2 gutentag rudolf
2 goodafternoon Alex
你可以为此使用爆炸:
df['greetingsname']=df['greetingsname'].apply(lambda x: x.split('|'))
res=df.explode('greetingsname')
print(res)
id greetingsname
0 1 hello+peter
0 1 goodbye+john
1 2 hi+cheff
1 2 gutentag+rudolf
1 2 goodafternoon+Alex
res[['greeting', 'name']] = res['greetingsname'].str.split('+', expand=True)
del res['greetingsname']
res.reset_index(drop=True, inplace=True)
print(res)
id greeting name
0 1 hello peter
1 1 goodbye john
2 2 hi cheff
3 2 gutentag rudolf
4 2 goodafternoon Alex
我有数据框:
id | 问候姓名 |
---|---|
1 | 你好+彼得|再见+约翰 |
2 | hi+cheff|gutentag+rudolf|goodafternoon+Alex |
我想要
id | 问候语 | 姓名 |
---|---|---|
1 | 你好 | 彼得 |
1 | 再见 | 约翰 |
2 | 嗨 | 厨师 |
2 | gutentag | 鲁道夫 |
2 | 下午好 | 亚历克斯 |
我不知道如何动态拆分列 greetingsname,以获得我想要的,因为列 greetingsname 具有不同的字符串长度。但是分隔符分布保持不变greeting DELIMETER(+) name DELIMETER(|) greeting DELIMETER(+) name
从这个意义上说,它可以有不同的长度(几个名字和问候语,在另一列中有不同数量的名字和问候语)
感谢
我们可以试试extractall
df.set_index('id')['greetingsname']\
.str.extractall(r'(?P<greeting>[^+|]+)\+(?P<name>[^|]+)').droplevel(1)
greeting name
id
1 hello peter
1 goodbye john
2 hi cheff
2 gutentag rudolf
2 goodafternoon Alex
你可以为此使用爆炸:
df['greetingsname']=df['greetingsname'].apply(lambda x: x.split('|'))
res=df.explode('greetingsname')
print(res)
id greetingsname
0 1 hello+peter
0 1 goodbye+john
1 2 hi+cheff
1 2 gutentag+rudolf
1 2 goodafternoon+Alex
res[['greeting', 'name']] = res['greetingsname'].str.split('+', expand=True)
del res['greetingsname']
res.reset_index(drop=True, inplace=True)
print(res)
id greeting name
0 1 hello peter
1 1 goodbye john
2 2 hi cheff
3 2 gutentag rudolf
4 2 goodafternoon Alex