Python 数据帧将数组项拆分为两列
我有一个如下所示的数据框:Python 数据帧将数组项拆分为两列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据框: reviewerID asin reviewerName helpful unixReviewTime \ 0 A1N4O8VOJZTDVB B004A9SDD8 Annette Yancey [1, 1] 1383350400 我想把“有用的”列分成两个不同的列,分别命名为“有用的分子”和“有用的分母”,我想不出来 任何帮助都将不胜感激 如果help是一列列表,则可以使用str访问列表中的元素: df[
reviewerID asin reviewerName helpful unixReviewTime \
0 A1N4O8VOJZTDVB B004A9SDD8 Annette Yancey [1, 1] 1383350400
我想把“有用的”列分成两个不同的列,分别命名为“有用的分子”和“有用的分母”,我想不出来
任何帮助都将不胜感激 如果
help
是一列列表,则可以使用str
访问列表中的元素:
df['helpful_numerator'] = df.helpful.str[0]
df['helpful_denominator'] = df.helpful.str[1]
df
假设列包含列表,您可以使用.apply
df['helpful_numerator'] = df['helpful'].apply(lambda x: x[0])
df['helpful_denominator'] = df['helpful'].apply(lambda x: x[1])
您可以使用将help
解压缩到单独的列中:
df['helpful_numerator'], df['helpful_denominator'] = zip(*df['helpful'])
编辑
正如@MaxU在评论中提到的,如果您想从数据框中删除有用的
列,请在zip
中选择该列时使用:
df['helpful_numerator'], df['helpful_denominator'] = zip(*df.pop('helpful'))
计时
使用以下设置创建一个更大的示例数据帧和函数来计时:
df = pd.DataFrame({'A': list('abc'), 'B': [[0,1],[2,3],[4,5]]})
df = pd.concat([df]*10**5, ignore_index=True)
def root(df):
df['C'], df['D'] = zip(*df['B'])
return df
def maxu(df):
return df.join(pd.DataFrame(df.pop('B').tolist(), columns=['C', 'D']))
def flyingmeatball(df):
df['C'] = df['B'].apply(lambda x: x[0])
df['D'] = df['B'].apply(lambda x: x[1])
return df
def psidom(df):
df['C'] = df.B.str[0]
df['D'] = df.B.str[1]
return df
我得到以下时间安排:
%timeit root(df.copy())
10 loops, best of 3: 70.6 ms per loop
%timeit maxu(df.copy())
10 loops, best of 3: 151 ms per loop
%timeit flyingmeatball(df.copy())
1 loop, best of 3: 223 ms per loop
%timeit psidom(df.copy())
1 loop, best of 3: 283 ms per loop
另一个解决方案:
In [74]: df
Out[74]:
reviewerID asin reviewerName unixReviewTime helpful
0 A1N4O8VOJZTDVB B004A9SDD8 Annette Yancey 1383350400 [1, 1]
In [75]: df.join(pd.DataFrame(df.pop('helpful').tolist(),
columns=['helpful_numerator','helpful_denominator']))
Out[75]:
reviewerID asin reviewerName unixReviewTime helpful_numerator helpful_denominator
0 A1N4O8VOJZTDVB B004A9SDD8 Annette Yancey 1383350400 1 1
非常好的解决方案!很好,我喜欢这个!“*”在这个解决方案中做什么?如果OP不需要原始的
帮助列,我会更改:zip(*df['help'])
-->zip(*df.pop('help'))
splitting@Boud:我只是做了一些快速计时,zip
似乎更快。我将很快添加计时。