我想获取一个数据框并复制某些行。
一列称为name
,可以有多个名称。
下面是一个示例数据框:
data = [
['Joe', '17-11-2018', '2'],
['Karen', '17-11-2018', '4'],
['Bill, Avery', '17-11-2018', '6'],
['Sam', '18-11-2018', '4'],
['Alex, Frank', '18-11-2018', '6'],
['Chris', '18-11-2018', '8'],
]
df = pd.DataFrame(data, columns = ['name','date','number'])
这将产生以下数据帧:
name date number
0 Joe 17-11-2018 2
1 Karen 17-11-2018 4
2 Bill, Avery 17-11-2018 6
3 Sam 18-11-2018 4
4 Alex, Frank 18-11-2018 6
5 Chris 18-11-2018 8
我想将具有多个名称(用逗号分隔)的所有行作为一个单独的名称重复。结果数据框应如下所示:
name date number
0 Joe 17-11-2018 2
1 Karen 17-11-2018 4
2 Bill 17-11-2018 6
3 Avery 17-11-2018 6
4 Sam 18-11-2018 4
5 Alex 18-11-2018 6
6 Frank 18-11-2018 6
7 Chris 18-11-2018 8
答案 0 :(得分:3)
在str.split
之后,它变成了unnest
问题
df['name']=df.name.str.split(',')
unnesting(df,['name'])
Out[97]:
name date number
0 Joe 17-11-2018 2
1 Karen 17-11-2018 4
2 Bill 17-11-2018 6
2 Avery 17-11-2018 6
3 Sam 18-11-2018 4
4 Alex 18-11-2018 6
4 Frank 18-11-2018 6
5 Chris 18-11-2018 8
def unnesting(df, explode):
idx = df.index.repeat(df[explode[0]].str.len())
df1 = pd.concat([
pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
df1.index = idx
return df1.join(df.drop(explode, 1), how='left')
答案 1 :(得分:1)
杰克。我使用的数据框不多,但以下代码应该在之前 df = pd.DataFrame(data, columns = ['name','date','number'])
new_data = []
for item in data:
if "," in item[0]:
new_data.append([item[0].split(", ")[0], item[1], item[2]])
new_data.append([item[0].split(", ")[1], item[1], item[2]])
else:
new_data.append(item)
答案 2 :(得分:0)
对于带有分隔符的字符串,可以使用在this答案中找到的以下函数:
def explode_str(df, col, sep):
s = df[col]
i = np.arange(len(s)).repeat(s.str.count(sep) + 1)
return df.iloc[i].assign(**{col: sep.join(s).split(sep)})
explode_str(df, 'name', ',')
name date number
0 Joe 17-11-2018 2
1 Karen 17-11-2018 4
2 Bill 17-11-2018 6
2 Avery 17-11-2018 6
3 Sam 18-11-2018 4
4 Alex 18-11-2018 6
4 Frank 18-11-2018 6
5 Chris 18-11-2018 8