将列中的数字拆分为单独列中的数字

时间:2017-09-23 14:49:25

标签: python pandas dataframe split

我有一个看起来像这样的csv文件(访问不能聚合,因为它们引用了几天,例如2 =星期一,3 =星期二......等)

enter image description here

我想拆分“访问”列,以便将每个数字放在一个单独的列中。像这样:

enter image description here

我怎么能用python做到这一点?我希望列数与数字一样多。我有1000行

我从这个代码开始,但它只是没有用。

import pandas as pd
 file=pd.read_csv('file.csv')

data = []
with open('file.csv', 'r') as fh:
for line in fh:
 data.append(line.split())

 data = dict(zip(*data))
 d = { v for in [int(c)]) 
data['visits'][1:])]}
d['ID'] = data['ID']
d['visits'] = data['visits'][0]
data = pd.DataFrame(d)

1 个答案:

答案 0 :(得分:3)

使用str.split

df

   ID       visits
0   1   12 1 40 50
1   2  56 2 567 34
2   3   4 5 345 78

visits = df['visits'].str.split(expand=True).add_prefix('visit_')    
visits

  visit_0 visit_1 visit_2 visit_3
0      12       1      40      50
1      56       2     567      34
2       4       5     345      78

接下来,将visitsID

连接起来
df = pd.concat([df[['ID']], visits], 1)    
df

   ID visit_0 visit_1 visit_2 visit_3
0   1      12       1      40      50
1   2      56       2     567      34
2   3       4       5     345      78

如果您想分别对每个号码的每个数字进行排序,则会链接df.apply个电话。此外,要使用8替换0,请使用df.replace

visits = df['visits'].str.replace('\s+', '')\
           .apply(lambda x: pd.Series(list(x))).add_prefix('visit_')\
           .replace('[89]', 0, regex=True)
visits

  ID visit_0 visit_1 visit_2 visit_3 visit_4 visit_5 visit_6 visit_7
0   1       1       2       1       4       0       5       0     NaN
1   2       5       6       2       5       6       7       3       4
2   3       4       5       3       4       5       7       0     NaN

请注意,每列都是一列字符串(object类型)。但是,如果你想要它们作为整数,你会想要摆脱NaN。如果您可以删除NaN列,则此解决方案会稍微简化一下。

visits = df.visits.str.replace('\s+', '')\
           .apply(lambda x: pd.Series(list(x)))\
           .dropna(axis=1).add_prefix('visit_').astype(int) % 8
visits

   visit_0  visit_1  visit_2  visit_3  visit_4  visit_5  visit_6
0        1        2        1        4        0        5        0
1        5        6        2        5        6        7        3
2        4        5        3        4        5        7        0

您仍然需要使用visitsdf.IDpd.concat连接起来。