我有一个熊猫数据框,如下所示:
+----+-------+-----+
| | 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
之类的问题,但是我宁愿不遍历数据框。
答案 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);