tla*_*gan 2 python dataframe pandas
我有一个如下所示的数据框:
reviewerID asin reviewerName helpful unixReviewTime \
0 A1N4O8VOJZTDVB B004A9SDD8 Annette Yancey [1, 1] 1383350400
Run Code Online (Sandbox Code Playgroud)
我想将"有用的"列分成两个不同的列,名称为"helpful_numerator"和"有用的分母",我无法弄明白.
任何帮助将非常感激!
您可以使用zip
解压缩helpful
到单独的列:
df['helpful_numerator'], df['helpful_denominator'] = zip(*df['helpful'])
Run Code Online (Sandbox Code Playgroud)
编辑
正如@MaxU在评论中所提到的,如果要从DataFrame中删除helpful
列,请pop
在选择以下列时使用zip
:
df['helpful_numerator'], df['helpful_denominator'] = zip(*df.pop('helpful'))
Run Code Online (Sandbox Code Playgroud)
计时
使用以下设置创建一个更大的示例DataFrame和函数来计时:
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
Run Code Online (Sandbox Code Playgroud)
我得到以下时间:
%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
Run Code Online (Sandbox Code Playgroud)