我有 280 个 CSV 文件,我需要为每个文件创建一行,其中包含所有数值的总和。这很简单,但我的问题是总和需要在第一行。
我一直在使用这段代码在文件中创建汇总行
df = pd.read_csv(file_path,sep=";",header=2, engine="python")
df.[Soma] = df.sum(numeric_only="boolean")
现在我需要将总和移动到第一行。我显然不是第一个遇到这个问题的人,但我在尝试让它工作时遇到了麻烦!我的 csv 文件很大,所以我不能简单地手动重新排序数据框中的行。
这里有一个建议的解决方案,看起来不错: Python Pandas: How to move one row to the first row of a Dataframe?
为了能够在此处发布数据框,我排除了 CSV 文件中的大部分行和列。这是它现在的样子(仍然没有成功):
DATA_BASE UF COD MUN CNPJ
0 199407.0 AC 1030.0 MANCIO LIMA 4064077.0
1 199407.0 AC 5184.0 MANOEL URBANO 4064077.0
2 199407.0 AC 9465.0 ASSIS BRASIL 4064077.0
3 199407.0 AC 15978.0 FEIJO 4064077.0
4 199407.0 AC 15978.0 FEIJO 4902979.0
5 199407.0 AC 18690.0 XAPURI 0.0
soma 1196442.0 NaN 66325.0 NaN 21159287.0
更新
好的,感谢@piRSquared,我想我有一个很好的书面方法功能:
def putfirst(df, i):
return df.iloc[(np.arange(len(df)) != i).argsort()]
putfirst(df,df.index.get_loc('soma'))
但是无论出于何种原因,数据框都没有发生任何事情。我没有收到任何错误,所以我认为 Python 根本没有调用该函数,但我不知道为什么。 缩进对我来说是正确的:
最佳答案
考虑示例数据框 df
df = pd.DataFrame(np. arange(16).reshape(4, 4), columns=list('ABCD'))
df
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
结合使用iloc
和argsort
我会依赖于两件事
- 对 bool 数组进行排序会将
False
放在第一位,因此当一个简单的序列数组不等于目标行时,我将进行排序。 - 排序是稳定的,因此所有
True
值将保持相同的相对顺序。 argsort
返回我需要用iloc
切片的数组。
def putfirst(df, i):
return df.iloc[(np.arange(len(df)) != i).argsort()]
putfirst(df, 3)
A B C D
3 12 13 14 15
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
putfirst(df, 2)
A B C D
2 8 9 10 11
0 0 1 2 3
1 4 5 6 7
3 12 13 14 15
head
和 tail
用于交换最后一行
df.tail(1).append(df.head(-1))
A B C D
3 12 13 14 15
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
与您的样本
putfirst(df, 6)
DATA_BASE UF COD MUN CNPJ
soma 1196442.0 NaN 66325.0 NaN 21159287.0
0 199407.0 AC 1030.0 MANCIO LIMA 4064077.0
1 199407.0 AC 5184.0 MANOEL URBANO 4064077.0
2 199407.0 AC 9465.0 ASSIS BRASIL 4064077.0
3 199407.0 AC 15978.0 FEIJO 4064077.0
4 199407.0 AC 15978.0 FEIJO 4902979.0
5 199407.0 AC 18690.0 XAPURI 0.0
或者
putfirst(df, len(df) - 1)
DATA_BASE UF COD MUN CNPJ
soma 1196442.0 NaN 66325.0 NaN 21159287.0
0 199407.0 AC 1030.0 MANCIO LIMA 4064077.0
1 199407.0 AC 5184.0 MANOEL URBANO 4064077.0
2 199407.0 AC 9465.0 ASSIS BRASIL 4064077.0
3 199407.0 AC 15978.0 FEIJO 4064077.0
4 199407.0 AC 15978.0 FEIJO 4902979.0
5 199407.0 AC 18690.0 XAPURI 0.0
或者
putfirst(df, df.index.get_loc('soma'))
DATA_BASE UF COD MUN CNPJ
soma 1196442.0 NaN 66325.0 NaN 21159287.0
0 199407.0 AC 1030.0 MANCIO LIMA 4064077.0
1 199407.0 AC 5184.0 MANOEL URBANO 4064077.0
2 199407.0 AC 9465.0 ASSIS BRASIL 4064077.0
3 199407.0 AC 15978.0 FEIJO 4064077.0
4 199407.0 AC 15978.0 FEIJO 4902979.0
5 199407.0 AC 18690.0 XAPURI 0.0
关于python - 无法将一行移动到数据框的顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49540279/