我想识别数据框中与字符串部分匹配的列名称,并将它们替换为原始名称以及添加到其中的一些新元素。新元素是由列表定义的整数。这是一个类似的问题,但恐怕建议的解决方案在我的特定情况下不够灵活。而这里是另一篇文章与接近我所面临的问题的一些优秀的答案。
我知道我可以组合两个字符串列表,将它们成对映射到字典中,并 使用字典作为函数中的输入重命名列df.rename。但这似乎有点太复杂了,而且考虑到现有列的数量会有所不同,这不是很灵活。要重命名的列数也是如此。
以下代码段将生成一个输入示例:
# Libraries
import numpy as np
import pandas as pd
import itertools
# A dataframe
Observations = 5
Columns = 5
np.random.seed(123)
df = pd.DataFrame(np.random.randint(90,110,size=(Observations, Columns)),
columns = ['Price','obs_1','obs_2','obs_3','obs_4'])
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'),
periods=Observations).tolist()
df['Dates'] = datelist
df = df.set_index(['Dates'])
print(df)
Run Code Online (Sandbox Code Playgroud)
我想识别以 开头的列名obs_,并newElements = [5, 10, 15, 20]在=符号后面的列表中添加元素(整数)。命名的列Price保持不变。列之后出现的其他列obs_也应保持不变。
以下代码段将演示所需的输出:
# Desired output
Observations = 5 …Run Code Online (Sandbox Code Playgroud) 我正在使用.groupby和.size方法从之前的数据框架创建一个新的pandas数据框.
[in] results = df.groupby(["X", "Y", "Z", "F"]).size()
[out]
9 27/02/2016 1 N 326
9 27/02/2016 1 S 332
9 27/02/2016 2 N 280
9 27/02/2016 2 S 353
9 27/02/2016 3 N 177
Run Code Online (Sandbox Code Playgroud)
这表现得如预期,但结果是没有列标题的数据帧.
此SO问题表明以下内容将列名添加到生成的数据帧中
[in] results.columns = ["X","Y","Z","F","Count"]
Run Code Online (Sandbox Code Playgroud)
但是,这似乎没有任何影响.
[out]
9 27/02/2016 1 N 326
9 27/02/2016 1 S 332
9 27/02/2016 2 N 280
9 27/02/2016 2 S 353
9 27/02/2016 3 N 177
Run Code Online (Sandbox Code Playgroud) 考虑一个简单的df:
HeaderA | HeaderB | HeaderC
476 4365 457
Run Code Online (Sandbox Code Playgroud)
有没有办法重命名所有列,例如最后添加到所有列的"X"?
HeaderAX | HeaderBX | HeaderCX
476 4365 457
Run Code Online (Sandbox Code Playgroud)
我正在连接多个数据帧,并希望根据它们来自哪个数据集轻松区分列.
或者这是唯一的方法吗?
df.rename(columns={'HeaderA': 'HeaderAX'}, inplace=True)
Run Code Online (Sandbox Code Playgroud)
我有超过50个列标题和10个文件; 所以上述方法需要很长时间.
谢谢
我有一个数据框:
df = pd.DataFrame(data=[[1,2]], columns=['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
我知道我可以执行以下操作来更改数据框中的所有列名称:
df.columns = ['d', 'e']
Run Code Online (Sandbox Code Playgroud)
如何更改链式操作中的所有列名?例如,我想做这样的事情:
df=(
df.rename all column names
.reset_index()
)
Run Code Online (Sandbox Code Playgroud)
我能找到的唯一方法是使用df.rename和构建一个包含新旧列对的字典,但这看起来非常难看。有没有更优雅的解决方案?
谢谢。
Y2010 Y2011 Y2012 Y2013 test
0 86574 77806 93476 99626 2
1 60954 67873 65135 64418 4
2 156 575 280 330 6
3 1435 1360 1406 1956 7
4 3818 7700 6900 5500 8
Run Code Online (Sandbox Code Playgroud)
有没有办法将此数据框的列从Y2010 ...重命名为2010 ..即删除初始的'Y'.我想使用正则表达式,因为我有很多这样的列.我试过这个:
df.rename(df.filter(regex='^Y\d{4}').columns.values, range(2010, 2013 + 1, 1))
Run Code Online (Sandbox Code Playgroud)
--EDIT:数据帧的包含不以'Y'开头的列
我不确定这是否是愚蠢的方法,但是我有几个数据帧,所有数据帧都有相同的列。我需要重命名每个列中的列以反映每个数据框的名称(此后,我将对所有这些列进行外部合并)。
比方说,数据帧被称为df1,df2并且df3,每个包含列name,date和count。
我想每一列重命名df1为name_df1,date_df1和count_df1。
我编写了一个函数来重命名列,因此:
df_list=[df1, df2, df3]
def rename_cols():
col_name="name"+suffix
col_count="count"+suffix
col_date="date"+suffix
for x in df_list:
if x['name'].tail(1).item() == df1['name'].tail(1).item():
suffix="_"+"df1"
rename_cols()
continue
elif x['name'].tail(1).item() == df2['name'].tail(1).item():
suffix="_"+"df2"
rename_cols()
continue
else:
suffix="_"+"df3"
rename_cols()
col_names=[col_name,col_date,col_count]
x.columns=col_names
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到以下错误: KeyError: 'name'
我真的很难弄清楚为什么会这样。df1的列(的第一个数据帧df_list)被重命名。其他所有内容都保持不变...我是在搞乱基本语法(可能是),还是我对事情应该如何工作有根本的误解?
据我所知,列表中的第一个数据帧将不止一次地迭代-但是为什么会这样呢?
非常基本的问题:当我想获得 20 个名称为 s1、s2、s3、...、s20 的列时,为 pandas 数据框生成一组列名称的最简单方法(最少代码)是什么?
我想仅交换(交换)pandas 中的列名,最好使用单行。另一个问题是我有大约 100 列,这导致我无法重新分配所有列名称,因此我想替换成对的选定列名称。我不知道列的索引(它会有所不同),所以我必须使用列名。
我尝试了以下代码:
import pandas as pd
probes = {'Spam': [0.0,1.0],
'Ham': [1.0,0.0],
'PT011': [0.11,0.21],
'PT012': [0.12,0.22],
'PT021': [0.21,0.11],
'PT022': [0.22,0.12]}
df = pd.DataFrame(probes,columns= ['Spam','Ham','PT011', 'PT012','PT021','PT022'])
print("Before renaming:\n",df)
df.rename(columns={'PT011':'PT021', 'PT012':'PT022','PT021':'PT011','PT022':'PT012'}, inplace=True)
print("After renaming:\n",df)
Run Code Online (Sandbox Code Playgroud)
我得到了:
Before renaming:
Spam Ham PT011 PT012 PT021 PT022
0 0.0 1.0 0.11 0.12 0.21 0.22
1 1.0 0.0 0.21 0.22 0.11 0.12
After renaming:
Spam Ham PT021 PT022 PT011 PT012
0 0.0 1.0 0.11 0.12 0.21 0.22
1 1.0 0.0 0.21 0.22 0.11 0.12 …Run Code Online (Sandbox Code Playgroud) 我从这里借用这个例子。我有一个这样的数据框:
# Import pandas package
import pandas as pd
# Define a dictionary containing ICC rankings
rankings = {'test': ['India', 'South Africa', 'England',
'New Zealand', 'Australia'],
'odi': ['England', 'India', 'New Zealand',
'South Africa', 'Pakistan'],
't20': ['Pakistan', 'India', 'Australia',
'England', 'New Zealand']}
# Convert the dictionary into DataFrame
rankings_pd = pd.DataFrame(rankings)
# Before renaming the columns
print(rankings_pd)
test odi t20
0 India England Pakistan
1 South Africa India India
2 England New Zealand Australia
3 New Zealand South Africa …Run Code Online (Sandbox Code Playgroud)