我需要处理一些有点凌乱的数据……它里面包含了表头名称。如何从已存在的Pandas数据框中选择一行,并将其(重命名为)列标题?
我想要做的事情类似于:
header = df[df['old_header_name1'] == 'new_header_name1']
df.columns = header
In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])
In [22]: df
Out[22]:
0 1 2
0 1 2 3
1 foo bar baz
2 4 5 6
将列标签设置为第2行(索引位置1)中的值:
In [23]: df.columns = df.iloc[1]
如果索引具有唯一标签,您可以使用以下方法删除第二行:
In [24]: df.drop(df.index[1])
Out[24]:
1 foo bar baz
0 1 2 3
2 4 5 6
如果索引不唯一,您可以使用:
In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]:
1 foo bar baz
0 1 2 3
2 4 5 6
使用df.drop(df.index[1])
会删除所有标签与第二行相同的行。由于非唯一索引可能会导致类似这样的障碍(或潜在的错误),因此最好确保索引是唯一的(即使Pandas不需要)。
这个版本适用(pandas v'0.19.2'):
df.rename(columns=df.iloc[0])
.drop(df.index[0])
来删除“标题”行。该操作会删除DataFrame中索引为0的行,也就是第一行,即“标题”行。 - ostrokach.reset_index(drop=True)
。 - onestep.ua重新创建数据框架会更容易。这也将从头开始解释列类型。
headers = df.iloc[0]
new_df = pd.DataFrame(df.values[1:], columns=headers)
重新命名标题而不重新分配df:
df.rename(columns=df.iloc[0], inplace = True)
不重新分配 df 的情况下删除行:
df.drop(df.index[0], inplace = True)
header
参数指定行索引,该参数代表用作列名和数据开头的行号(s)
。这样做的好处是自动删除所有之前的废弃行。import pandas as pd
from io import StringIO
In[1]
csv = '''junk1, junk2, junk3, junk4, junk5
junk1, junk2, junk3, junk4, junk5
pears, apples, lemons, plums, other
40, 50, 61, 72, 85
'''
df = pd.read_csv(StringIO(csv), header=2)
print(df)
Out[1]
pears apples lemons plums other
0 40 50 61 72 85
Pandas DataFrames有columns
属性,为什么不与标准Python一起使用呢?这样做更清晰明了:
table = [['name', 'Rf', 'Rg', 'Rf,skin', 'CRI'],
['testsala.cxf', '86', '95', '92', '87'],
['testsala.cxf: 727037 lm', '86', '95', '92', '87'],
['630.cxf', '18', '8', '11', '18'],
['Huawei stk-lx1.cxf', '86', '96', '88', '83'],
['dedo uv no filtro.cxf', '52', '93', '48', '58']]
import pandas as pd
data = pd.DataFrame(table[1:],columns=table[0])
或者在情况下不是第一行,而是第10行,例如:
columns = table.pop(10)
data = pd.DataFrame(table,columns=columns)
df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]]
。 - unutbu