Pandas dataframe将数组条目分为两列

2024-10-01 04:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来像这样:

       reviewerID        asin    reviewerName helpful  unixReviewTime  \
0  A1N4O8VOJZTDVB  B004A9SDD8  Annette Yancey  [1, 1]      1383350400   

我想把“有用的”列分成两个不同的列,分别命名为“有用的分子”和“有用的分母”,我想不通。在

任何帮助都将不胜感激!在


Tags: 数据分子命名helpful分母asinrevieweridreviewername
3条回答

还有一个解决方案:

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

您可以使用^{}helpful解压缩到单独的列中:

df['helpful_numerator'], df['helpful_denominator'] = zip(*df['helpful'])

编辑

正如@MaxU在评论中提到的,如果您想从数据框中删除helpful列,请在选择zip中的列时使用^{}

^{pr2}$

计时

使用以下设置创建更大的示例数据帧和函数以进行计时:

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

如果helpful是一列列表,则可以使用str访问列表中的元素:

df['helpful_numerator'] = df.helpful.str[0]    
df['helpful_denominator'] = df.helpful.str[1]
df

enter image description here

相关问题 更多 >