Pandas数据帧将数组分成两列

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"和"有用的分母",我无法弄明白.

任何帮助将非常感激!

roo*_*oot 7

您可以使用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)

  • @Boud:我刚做了一些快速的时间,而`zip`看起来更快.我马上就会加上时间. (2认同)