我有一个看起来像这样的csv文件(访问不能聚合,因为它们引用了几天,例如2 =星期一,3 =星期二......等)
我想拆分“访问”列,以便将每个数字放在一个单独的列中。像这样:
我怎么能用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)
答案 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
接下来,将visits
与ID
:
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
您仍然需要使用visits
将df.ID
与pd.concat
连接起来。