如何摆脱pandas数据帧中的`Unnamed:`列

时间:2016-04-09 15:47:44

标签: python pandas csv dataframe

我遇到这种情况,有时当我从csv读取df时,我会得到一个名为unnamed:0的不需要的索引列。这很烦人!我试过了

merge.to_csv('xy.df', mode = 'w', inplace=False)

我认为这是一个解决方案,但我仍然得到unnamed:0列!有没有人对此有所了解?

8 个答案:

答案 0 :(得分:117)

这是索引列,传递index=False不写出来,请参阅docs

示例:

In [37]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
pd.read_csv(io.StringIO(df.to_csv()))

Out[37]:
   Unnamed: 0         a         b         c
0           0  0.109066 -1.112704 -0.545209
1           1  0.447114  1.525341  0.317252
2           2  0.507495  0.137863  0.886283
3           3  1.452867  1.888363  1.168101
4           4  0.901371 -0.704805  0.088335

与之比较:

In [38]:
pd.read_csv(io.StringIO(df.to_csv(index=False)))

Out[38]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

您还可以选择通过传递read_csv告诉index_col=0第一列是索引列:

In [40]:
pd.read_csv(io.StringIO(df.to_csv()), index_col=0)

Out[40]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

答案 1 :(得分:6)

另一种可能发生的情况是,如果您的数据被不正确地写入csv,以使每行以逗号结尾。当您尝试将数据读入Unnamed: x时,这将在数据末尾留下一个未命名的列df

答案 2 :(得分:3)

如果保存为CSV时无法删除索引(即CSV文件来自上游),则另一个选择是将index_col=[0]pd.read_csv一起使用。 IOW,在阅读时处理,而不是在写作时处理。

df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

# Save DataFrame to CSV.
df.to_csv('file.csv')

pd.read_csv('file.csv')

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

# Now try this again, with the extra argument.
pd.read_csv('file.csv', index_col=[0])

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

或者,您可以使用str.match进行过滤:

df 

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

df.columns
# Index(['Unnamed: 0', 'a', 'b', 'c'], dtype='object')

df.columns.str.match('Unnamed')
# array([ True, False, False, False])

df.loc[:, ~df.columns.str.match('Unnamed')]

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

答案 3 :(得分:3)

使用del df['column_name']

删除该列

答案 4 :(得分:2)

要使用所有未命名列,您还可以使用正则表达式,例如df.drop(df.filter(regex="Unname"),axis=1, inplace=True)

答案 5 :(得分:1)

您可以对未命名的列执行以下操作:

  1. 删除未命名的列
  2. 重命名它们(如果您想使用它们)

file.csv

$callChargesSql = "SELECT 
                customer,
                source,
                source_name,
                calltype,
                SUM(case when inclusive = '1' then customer_cost else 0 end) as customer_total,
                SUM(cost) as cost,
                SUM(recording_cost) as recording_cost,
                SUM(recording_customer) as recording_customer
            FROM
                billing_calldata
            WHERE
                (
                    customer = '".db_string($result["sequence"])."' OR
                    customer IN 
                    (
                        SELECT 
                            sequence 
                        FROM 
                            customer 
                        WHERE 
                            resellerid = '".db_string($result["sequence"])."'
                    )
                ) AND
                (
                    (
                        MONTH(timestamp) = '".db_string($calls["month"])."' AND
                        YEAR(timestamp) = '".db_string($calls["year"])."'
                    ) OR
                    status = 'y'
                )
            GROUP BY customer, source, calltype
            ORDER BY customer, timestamp ASC;";

#read文件 ,A,B,C 0,1,2,3 1,4,5,6 2,7,8,9

方法1:删除未命名的列

df = pd.read_csv('file.csv')

方法2:重命名未命名的列

# delete one by one like column is 'Unnamed: 0' so use it's name df.drop('Unnamed: 0', axis=1, inplace=True) #delete all Unnamed Columns in a single code of line using regex df.drop(df.filter(regex="Unnamed"),axis=1, inplace=True)

如果要像输入文件中那样用空白标题写出来,只需在上方选择“名称”作为“。

答案 6 :(得分:1)

简单地做到这一点:

df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

答案 7 :(得分:1)

或者:

df = df.drop(columns=['Unnamed: 0'])