python - 使用 Pandas 将列表列扩展为值和天数

标签 python pandas

我正在尝试解压包含具有值列表的列的数据集。每个列表中的第一个位置表示在“日期”列中的日期进行的测量。下一个位置是前一天进行的测量,依此类推(最多 30 天)。这些列表的长度并不相同,但 count_users 中的列表长度将等于 count_samples 中的长度。

目标是获取数据,使得每个名称每个日期有 1 行,每行中对 count_users 和 count_samples 进行单个测量。

换句话说,数组的位置需要映射到特定的一天,并且每个名称的测量值应该每天求和。

原始数据如下所示:

Name     Date       count_users      count_samples
A     2017-10-20   [0,0,1,2,2,4]     [1,2,1,1,1,3]
A     2017-10-18   [5,2,0,0,0,0]     [1,2,1,1,1,3]
B     2017-11-24   [0,0,0,0,4]       [1,1,1,1,3]
C     2017-09-02   []                []
D     2017-10-30   [0,0,2,4]         [1,2,1,1]

结果应该如下所示:

Name  Date          count_users      count_samples
A     2017-10-20    0                1
A     2017-10-19    0                2
A     2017-10-18    6                2
A     2017-10-17    4                3
A     2017-10-16    2                2
A     2017-10-15    4                4
A     2017-10-14    0                1
A     2017-10-13    0                3

谁能推荐一个解决方案吗?

更新字典式数据:

{'Date': {0: Timestamp('2017-10-20 00:00:00'),
  1: Timestamp('2017-10-18 00:00:00'),
  2: Timestamp('2017-11-24 00:00:00'),
  3: Timestamp('2017-09-02 00:00:00'),
  4: Timestamp('2017-10-30 00:00:00')},
 'Name': {0: 'A', 1: 'A', 2: 'B', 3: 'C', 4: 'D'},
 'count_samples': {0: [1, 2, 1, 1, 1, 3],
  1: [1, 2, 1, 1, 1, 3],
  2: [1, 1, 1, 1, 3],
  3: [],
  4: [1, 2, 1, 1]},
 'count_users': {0: [0, 0, 1, 2, 2, 4],
  1: [5, 2, 0, 0, 0, 0],
  2: [0, 0, 0, 0, 4],
  3: [],
  4: [0, 0, 2, 4]}}

最佳答案

有点难拿到

New_df=pd.DataFrame({'Date':np.concatenate(np.array([pd.date_range(end=x,periods=y,freq='D')[::-1] for x,y in zip(df.Date,df.count_samples.apply(len))])),
           'Name':df.Name.repeat(df.count_samples.apply(len)),
           'count_samples':np.concatenate(df.count_samples.values),
           'count_users':np.concatenate(df.count_users.values)})

New_df.groupby(['Name','Date'],as_index=False).sum().sort_values(['Name','Date'],ascending=[True,False])
Out[458]: 
   Name       Date  count_samples  count_users
7     A 2017-10-20            1.0          0.0
6     A 2017-10-19            2.0          0.0
5     A 2017-10-18            2.0          6.0
4     A 2017-10-17            3.0          4.0
3     A 2017-10-16            2.0          2.0
2     A 2017-10-15            4.0          4.0
1     A 2017-10-14            1.0          0.0
0     A 2017-10-13            3.0          0.0
12    B 2017-11-24            1.0          0.0
11    B 2017-11-23            1.0          0.0
10    B 2017-11-22            1.0          0.0
9     B 2017-11-21            1.0          0.0
8     B 2017-11-20            3.0          4.0
16    D 2017-10-30            1.0          0.0
15    D 2017-10-29            2.0          0.0
14    D 2017-10-28            1.0          2.0
13    D 2017-10-27            1.0          4.0

关于python - 使用 Pandas 将列表列扩展为值和天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48101560/

相关文章:

python - 使用 urllib2 将 solr curl updateJSON 语法转换为 python

python - PyQt4:从 rawHeaderList 中提取值

python - 如何使用 DRF JWT 实现记住我功能?

python - 如何链接到 css 文件中的静态图像?

python - 如何将带有换行符的列标题读入 Pandas?

python - 使用复杂列表定义类时出现类型错误

python - 替换 Pandas 数据框中的值 - 更改功能?

python - 选择 Pandas 多索引/多列 DataFrame 的列表切片

Python Pandas 是否可以在生成的序列中找到最大值,而无需将序列存储到内存中?

python - pandas.DataFrame.where 对齐方式