Gab*_*ski 4 python dataframe pandas
让我们考虑以下 DataFrame
| 姓名 | A | 乙 | C | D |
|---|---|---|---|---|
| 汤姆 | 10.0 | 南 | 南 | 南 |
| 汤姆 | 南 | 15.0 | 南 | 南 |
| 汤姆 | 南 | 南 | 20.0 | 南 |
| 汤姆 | 南 | 南 | 南 | 25.0 |
| 汤姆 | 30.0 | 南 | 南 | 南 |
| 汤姆 | 南 | 南 | 南 | 40.0 |
| 约翰 | 1.0 | 南 | 南 | 南 |
| 约翰 | 南 | 2.0 | 南 | 南 |
| 约翰 | 南 | 南 | 3.0 | 南 |
| 约翰 | 南 | 南 | 南 | 4.0 |
| 约翰 | 5.0 | 南 | 南 | 南 |
| 约翰 | 南 | 6.0 | 南 | 南 |
| 约翰 | 南 | 南 | 7.0 | 南 |
| 约翰 | 南 | 南 | 南 | 8.0 |
我想折叠它以限制NaNDataFrame 中的值的数量 - 可以是连续的,即如果可能的话合并相邻行,但我关心的是列的值在折叠后A-D对应相同的值Name
我的完美结果是
| 姓名 | A | 乙 | C | D |
|---|---|---|---|---|
| 汤姆 | 10.0 | 15.0 | 20.0 | 25.0 |
| 汤姆 | 30.0 | 南 | 南 | 40.0 |
| 约翰 | 1.0 | 2.0 | 3.0 | 4.0 |
| 约翰 | 5.0 | 6.0 | 7.0 | 8.0 |
据我了解,Pandasgroupby('Name')不会这样做,因为它会为每个名字留下一个条目。
如果这有任何帮助,我使用字典来创建数据框。字典看起来像这样:
{
"a": {
"tom": [10.0, 30.0],
"john": [1.0, 5.0]
},
"b": {
"tom": [15.0],
"john": [2.0, 6.0]
},
.....
}
Run Code Online (Sandbox Code Playgroud)
因此,基本上,我会获取字典中的每个数字,然后仅使用该数字创建一行,然后合并所有行。
有没有一种简单的方法可以折叠生成的 DataFrame 或在给定这样的字典的情况下构建更紧凑的 DataFrame
您可以.groupby+ .transform(向上“移动”值)。然后删除包含所有NaN值的行:
print(
df.set_index("Name")
.groupby(level=0)
.transform(lambda x: sorted(x, key=lambda k: pd.isna(k)))
.dropna(axis=0, how="all")
.reset_index()
)
Run Code Online (Sandbox Code Playgroud)
印刷:
Name A B C D
0 tom 10.0 15.0 20.0 25.0
1 tom 30.0 NaN NaN 40.0
2 john 1.0 2.0 3.0 4.0
3 john 5.0 6.0 7.0 8.0
Run Code Online (Sandbox Code Playgroud)