我有一个单一的CSV文件,在其中我想重命名一些列相同的名称。我的初始代码如下所示
df = pd.read_csv('New.csv')
我用这段代码从dataframe中提取了选定的列
df.columns[1::3]
此切片每隔三列获取一次。现在我想用相同的名称重命名每三列一次,但这样重命名我的列会出错
df.columns[1::3]= ['SomeName']
raise TypeError("Index does not support mutable operations")
有没有办法在pandas中重命名多个同名列?
除了手动操作,还有其他建议吗?
基础pandas
索引对象是numpy
数组。
您可以利用这一事实,使用numpy
约定进行切片和分配。
数据来自@jezrael。由于这个已知问题,需要显式提取值。
df = pd.DataFrame({'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
arr = df.columns.values
arr[1::3] = range(2)
df.columns = arr
print(df)
A 0 C D 1 F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
df.columns的类型为pandas.indexes.base.Index
,这就是您得到TypeError的原因。如果将其转换为列表,则可以使用切片进行更新(重命名),并将df.columns设置为更新后的列表。
这对我有效:
lst = list(df.columns)
lst[1::3] = ['someName']*len(lst[1::3])
df.columns = lst
或者使用唯一的新列名(正如@jezrael指出的,可能不建议使用相同的名称):
lst = list(df.columns)
lst[1::3] = ['someName{}'.format(x) for x in range(len(lst[1::3]))]
df.columns = lst
我认为最好使用重命名
和独特的新列名称,如:
df = pd.DataFrame({'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
print (df)
A B C D E F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
d = dict(zip(df.columns[1::3], range(len(df.columns[1::3]))))
print (d)
{'B': 0, 'E': 1}
df = df.rename(columns=d)
print (df)
A 0 C D 1 F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
或:
d = dict(zip(df.columns[1::3],
['name{}'.format(x) for x in range(len(df.columns[1::3]))]))
print (d)
{'B': 'name0', 'E': 'name1'}
df = df.rename(columns=d)
print (df)
A name0 C D name1 F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
不建议为相同的列名重命名解决方案:
d = dict.fromkeys(df.columns[1::3], 'Name')
print (d)
{'B': 'Name', 'E': 'Name'}
df = df.rename(columns=d)
print (df)
A Name C D Name F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 1 2 b
5 f 4 3 0 4 b
因为如果想要查看lct column
Name
它将返回DataFrame
中的所有列:
print (df['Name'])
Name Name
0 4 5
1 5 3
2 4 6
3 5 9
4 5 2
5 4 4
问题内容: 我在df中有几列相同的名称。需要重命名它们。无论如何,通常的重命名都会重命名,我可以将下面的blah重命名为blah1,blah4,blah5吗? 在[7]中: 问题答案: 我希望在Pandas中找到比通用Python解决方案更多的解决方案。如果Column的get_loc()函数找到带有“ True”值的重复项,则该掩码数组将返回掩码数组,“ True”值指向找到重复项的位置。然后,
问题内容: 我有一个名为的数据框。如何重命名唯一的一列标题?例如到? 问题答案: data.rename(columns={‘gdp’:’log(gdp)’}, inplace=True) 在它接受一个字典作为一个PARAM演出,所以你只是传递一个字典一次入境。
问题内容: 我有一些数据,导入时会得到以下不需要的列,我正在寻找一种删除所有这些数据的简便方法 它们被0索引索引,所以我尝试了类似 但这不是很有效。我尝试编写一些for循环,但这使我感到震惊,因为熊猫的行为不佳。因此,我在这里问这个问题。 我已经看到了一些类似的示例(投递多列pandas),但这无法回答我的问题。 问题答案: 我不知道您所说的低效率是什么意思,但是如果您指的是打字,那么选择感兴趣的
问题内容: 支持多级列名: 此功能非常有用,因为它允许“水平”地将同一数据框的多个版本附加到区分实例的列名称的第一级(在我的示例中)。 想象一下我已经有一个这样的数据框: 有没有一种好方法可以向列名添加另一个级别,类似于行索引: 问题答案: 无需创建元组列表 采用: 结果数据框: 2014年1月25日起提出要求
我知道我可以给单只熊猫重新命名。DataFrame列具有: 但是我想在不知道列名称的情况下重命名它(基于它的索引-尽管我知道字典没有)。我想重命名第1列,如下所示: 但是在DataFrame.columns dict中没有“1”条目,因此不进行重命名。我怎样才能做到这一点?
我试图基于单个条件,根据多列中的值过滤数据帧,但保留我根本不想应用过滤器的其他列。 我回顾了这些答案,第三个是最接近的,但仍然没有运气: 如何按多列筛选数据帧 筛选多个列 Python熊猫-如何按一个值筛选多个列 设置: 电流输出: 期望输出: 我试过: 以及许多其他变体(,,