拆分列包含2个值到pandas df中的不同列

时间:2016-11-17 03:03:42

标签: python regex python-2.7 python-3.x pandas

我在pandas df中有一张桌子

bigram         frequency
(123,3245)       2
(676,35346)      84
(93,32)          9

等等,直到50行。

我正在寻找的是,将 bigram 列拆分为两个不同的列,删除括号和逗号,

col1     col2      frequency
123       3245        2
676       35346       84
93        32          9

有没有办法在逗号之后拆分,并删除括号。

3 个答案:

答案 0 :(得分:3)

如果您的bigram列恰好是字符串格式,则可以使用.str.extract()方法和正则表达式从中提取数字:

pd.concat([df.bigram.str.extract('(?P<col1>\d+),(?P<col2>\d+)'), df.frequency], axis = 1)

enter image description here

或者,如果bigram列是元组类型:

Method1 :使用pd.Series从元组创建列:

pd.concat([df.bigram.apply(lambda x: pd.Series(x, index=['col1', 'col2'])), 
           df.frequency], axis=1)

Method2 :使用.str从元组中获取第一个和第二个元素

df['col1'], df['col2'] = df.bigram.str[0], df.bigram.str[1]
df = df.drop('bigram', axis=1)

答案 1 :(得分:2)

尝试为每对元组创建一个新列。

df['col1'] = df['bigram'].apply(lambda x: x[0])
df['col2'] = df['bigram'].apply(lambda x: x[1])

要创建仅包含col1col2frequency订单非常重要的数据框,可以更轻松地创建新数据框并填充它。

df_new = pd.DataFrame()
df_new['col1'] = df['bigram'].apply(lambda x: x[0])
df_new['col2'] = df['bigram'].apply(lambda x: x[1])
df_new['frequency'] = df['frequency']

答案 2 :(得分:2)

非常接近@ Psidom的回答 我使用pd.DataFrame(df.bigram.values.tolist(), columns=['c1', 'c2'])代替df.bigram.apply(lambda x: pd.Series(x, index=['col1', 'col2']))

pd.concat([pd.DataFrame(df.bigram.values.tolist(), columns=['c1', 'c2']),
           df.drop('bigram', 1)],
          axis=1)

enter image description here