创建其他记录并用熊猫填充

时间:2018-09-15 13:36:35

标签: python pandas

我有一个熊猫数据框,如下所示:

+----+-------+-----+
|    | name  | max |
+----+-------+-----+
| 0  | a     | 1   |
| 1  | b     | 2   |
| 2  | c     | 2   |
| 3  | d     | 4   |
| 4  | e     | 1   |
+----+-------+-----+

name代表项目名称,列max代表该名称所属的最大组号。通过提供这种数据的方式,一个项目不仅属于该最大组,而且还属于小于该数目的每个组。

我想“分解”此数据框以为每个名称创建其他记录,并在新列中将最大数量倒计数为值1

最终,我希望我的新数据框看起来像这样:

+----+-------+------+--------+
|    | name  | max  | number |
+----+-------+------+--------+
| 0  | a     | 1    | 1      |
| 1  | b     | 2    | 2      |
| 2  | b     | 2    | 1      |
| 3  | c     | 2    | 2      |
| 4  | c     | 2    | 1      |
| 5  | d     | 4    | 4      |
| 6  | d     | 4    | 3      |
| 7  | d     | 4    | 2      |
| 8  | d     | 4    | 1      |
| 9  | e     | 1    | 1      |
+----+-------+------+--------+

我当时正在考虑使用函数df.ffill(),但这仅填充NaN,我需要首先创建NaN行。我也在考虑使用df.groupby(),但是我不确定这是否也是正确的方向。

我可以想到这样一种方法来处理类似嵌套的for-loop之类的问题,但是我宁愿不遍历数据框。

2 个答案:

答案 0 :(得分:1)

我的变体是:

df2 = df.reindex(df.index.repeat(df["max"])).reset_index(drop=True)
df2["number"] = df2.groupby("name").cumcount(ascending=False) + 1

给出

In [137]: df2
Out[137]: 
  name  max  number
0    a    1       1
1    b    2       2
2    b    2       1
3    c    2       2
4    c    2       1
5    d    4       4
6    d    4       3
7    d    4       2
8    d    4       1
9    e    1       1

它确实假定原始索引是唯一的,以使重复操作简洁明了。如果需要,我们可以替换为

df2 = df.iloc[np.repeat(range(len(df)), df["max"])].reset_index(drop=True)

之类的。

答案 1 :(得分:0)

您可以使用插补行的'max'列的累积总和重新索引数据框,在'name'列中用'bfill'填充行,并在'max'列中摸索递减顺序

$address

出局:

return view('profile.newaddress')->with('address', $address);