Pandas - 如何对由列表对象组成的列进行子集化?

时间:2015-05-16 02:33:49

标签: python json pandas dataframe

我正在处理一个JSON文件,我从Github使用:

curl https://api.github.com/repos/mbostock/d3/stats/commit_activity > d3_commit-activity.json

然后,在Pandas中我运行了以下命令:

import pandas as pd
import numpy as np
import matplotlib.pylab as plt

df = pd.io.json.read_json("d3_commit-activity.json")

df中的一个列称为“days”,其值是按以下格式列出的列表:

[0,0,0,1,0,1,0]
[0,0,0,0,0,1,1]
[3,0,0,0,0,0,0]

换句话说,每个列表恰好由七个数字组成。我想在这些列表中的每个元素中创建七个新列,但我对类似问题的解释完全感到困惑。我尝试遵循布拉德利解决这个问题的方法(pandas: How do I split text in a column into multiple rows?),但是被告知“名称'系列'没有定义”。尝试更改为“pd.Series”,这似乎适用于该命令但在后面的命令中失败。

当然必须有一种简单,直接的方法来获取这些列表并将它们分解为单独的列?

2 个答案:

答案 0 :(得分:2)

让我们定义一个day_names

的列表
import pandas as pd    
day_names = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']

然后其中任何一个都能达到预期效果:

df[day_names] = df.days.apply(lambda x: pd.Series(x))

或者,

df[day_names] = df.apply(lambda row: pd.Series(row.days), axis=1)

答案 1 :(得分:0)

从列表中创建列的简便方法如下:

df2 = pd.DataFrame(zip(*df.days)).T
df2.columns = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
>>> df2
   Sun  Mon  Tue  Wed  Thu  Fri  Sat
0    0    0    0    1    0    1    0
1    0    0    0    0    0    1    1
2    3    0    0    0    0    0    0

使用星号将参数解压缩,将它们放在不同的列中。