如何在阅读包含或不包含索引列的CSV时自动设置Pandas DataFrame的索引

taor4pac  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(198)

假设我有两个CSV文件,第一个文件input_1.csv有一个索引列,所以当我运行:

import pandas as pd
df_1 = pd.read_csv("input_1.csv")
df_1

我得到了一个DataFrame,它有一个索引列,还有一个名为Unnamed: 0的列,它与索引列相同。我可以通过添加参数index_col=0来防止这种重复,一切都很好。
第二个文件input_2.csv没有索引列,即如下所示:

|   stuff |   things |
|--------:|---------:|
|       1 |       10 |
|       2 |       20 |
|       3 |       30 |
|       4 |       40 |
|       5 |       50 |

运行pd.read_csv("input_2.csv")会得到一个带有索引列的DataFrame。在本例中,添加index_col=0参数会将索引列中的设置为stuff,就像CSV文件本身一样。
我的问题是,我有一个包含read_csv部分的函数,我希望它在两种情况下都返回一个带有索引列的DataFrame。有没有办法检测输入文件是否有索引列,如果没有就设置一个,如果有就什么都不做?

ffvjumwh

ffvjumwh1#

CSV没有内置的“索引”列的概念,所以我认为答案是一般情况下这是不可能的。
如果你能说“只有在未命名的情况下才使用0作为索引”,那就太好了,但是Pandas没有给予我们这个选项。
因此,您可能只需要检查是否出现Unnamed:列,并将这些列设置为索引。

fykwrbwg

fykwrbwg2#

我希望您所说的index是指序列号从01开始的列。
您可以使用某种导入后逻辑来决定第一列是否符合索引列的条件:
其逻辑是,如果默认索引和第一列之间的差异对于所有行都相同,则第一列包含递增序列(从任何数字开始)。前提条件是该列应为数字。
例如:

idx value
0    1     a
1    2     b
2    3     c
3    4     d
4    5     e
5    6     f

pd.api.types.is_numeric_dtype(df[df.columns[0]])
>> True

np.array(df.index) - df.iloc[:,0].values
>> array([-1, -1, -1, -1, -1, -1])

# If all values are equal
len(pd.Series(np.array(df.index) - df.iloc[:,0].values).unique()) == 1
>> True

相关问题