假设我有两个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。有没有一种方法可以检测输入文件是否有索引列,如果没有则设置一个,如果有则不执行任何操作?
CSV没有内置的";索引";专栏,所以我认为答案是这在一般情况下是不可能的。
如果你能说";仅在未命名的情况下使用0作为索引";,但潘达斯并没有给我们这样的选择。
因此,您可能只需要检查是否出现Unnamed:
列,并将这些列设置为索引。
索引,我希望您指的是序列号从0
或1
开始的列。
若第一列符合索引列的条件,您可以使用某种导入后逻辑来决定:
逻辑是,若所有行的默认索引和第一列之间的差异相同,则第一列包含递增序列(从任意数字开始(。先决条件是列应该是数字。
例如:
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