在将带有空字符串的新列添加到熊猫数据框时替换现有列名

Posted

技术标签:

【中文标题】在将带有空字符串的新列添加到熊猫数据框时替换现有列名【英文标题】:Replace existing column name while adding new columns with empty string to pandas dataframe 【发布时间】:2020-08-22 06:11:55 【问题描述】:

假设我有一个如下所示的数据框:

df = pd.DataFrame(0:['Hello World!']) # here df could have more than one column of data as shown below
df = pd.DataFrame(0:['Hello World!'], 1:['Hello Mars!']) # or df could have more than one row of data as shown below
df = pd.DataFrame(0:['Hello World!', 'Hello Mars!'])

我还有一个列名列表,如下所示:

new_col_names = ['a','b','c','d'] # here, len(new_col_names) might vary like below
new_col_names = ['a','b','c','d','e'] # but we can always be sure that the len(new_col_names) >= len(df.columns)

鉴于此,我如何替换 df 中的列名,使其结果如下:

df = pd.DataFrame(0:['Hello World!'])
new_col_names = ['a','b','c','d']
# result would be like this
a               b               c               d
Hello World!    (empty string)  (empty string)  (empty string)


df = pd.DataFrame(0:['Hello World!'], 1:['Hello Mars!']) 
new_col_names = ['a','b','c','d']
# result would be like this
a               b               c               d
Hello World!    Hello Mars!     (empty string)  (empty string)


df = pd.DataFrame(0:['Hello World!', 'Hello Mars!'])
new_col_names = ['a','b','c','d','e']
a               b               c               d               e
Hello World!    (empty string)  (empty string)  (empty string)  (empty string)
Hellow Mars!    (empty string)  (empty string)  (empty string)  (empty string)

通过阅读诸如this 之类的 *** 答案,我有一个模糊的想法,它可能如下所示:

df[new_col_names] = '' # but this returns KeyError
# or this
df.columns=new_col_names # but this returns ValueError: Length mismatch (of course)

如果有人可以向我展示一种覆盖现有数据框列名并同时在行中添加具有空字符串值的新数据列的方法,我将非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

想法是通过zip 的现有列名创建字典,仅重命名现有列,然后通过DataFrame.reindex 添加所有新列:

df = pd.DataFrame(0:['Hello World!', 'Hello Mars!'])
new_col_names = ['a','b','c','d','e']

df1 = (df.rename(columns=dict(zip(df.columns, new_col_names)))
        .reindex(new_col_names, axis=1, fill_value=''))
print (df1)
              a b c d e
0  Hello World!        
1   Hello Mars!      


df1 = (df.rename(columns=dict(zip(df.columns, new_col_names)))
         .reindex(new_col_names, axis=1))
print (df1)
              a   b   c   d   e
0  Hello World! NaN NaN NaN NaN
1   Hello Mars! NaN NaN NaN NaN  

【讨论】:

谢谢您,您的解决方案有效!我接受了你的,因为它比下面的其他人更早发布,也因为它是单行且整洁的。 :)【参考方案2】:

这是一个可以做你想做的事情

我找不到 1-liner,但 jezrael 找到了:his answer
import pandas as pd

# function
def rename_add_col(df: pd.DataFrame, cols: list) -> pd.DataFrame:
    c_len = len(df.columns)
    if c_len == len(cols):
        df.columns = cols
    else:
        df.columns = cols[:c_len]
        df = pd.concat([df, pd.DataFrame(columns=cols[c_len:])]) 
    return df

# create dataframe
t1 = pd.DataFrame('a': ['1', '2', '3'], 'b': ['4', '5', '6'], 'c': ['7', '8', '9'])

    a   b   c
0   1   4   7
1   2   5   8
2   3   6   9

# call function
cols = ['d', 'e', 'f']
t1 = rename_add_col(t1, cols)

    d   e   f
0   1   4   7
1   2   5   8
2   3   6   9

# call function
cols = ['g', 'h', 'i', 'new1', 'new2']
t1 = rename_add_col(t1, cols)


    g   h   i   new1    new2
0   1   4   7    NaN     NaN
1   2   5   8    NaN     NaN
2   3   6   9    NaN     NaN

【讨论】:

谢谢!您的解决方案也有效,但我接受了@jezrael 的回答,因为他的发布时间稍早一些,而这正是我最终使用的。再次感谢! :) @user1330974 没关系,他的答案更简洁,应该被接受。但是,时间越大,反映的是哪个答案最先提交。 Pranjal 是第一个提交,我的是第二个,jevrael 最后提交。但是,这不应该有影响。很高兴我们能解决您的问题。 感谢您理解并提供有效的解决方案。我没有意识到 *** 将答案从最新到最旧排序。这些年来,我一直在接受错误假设的答案。但是感谢您上面的评论,今天结束。 :) @user1330974 你应该总是接受最适合你的答案。如果提供了更好的答案,您可以接受一个答案,然后返回并接受一个新的答案。【参考方案3】:

这可能会帮助您一次完成所有操作

使用您的旧数据框通过 pd.DataFrame() 方法重新创建另一个数据框,然后通过列表添加在列参数中添加新列。

注意:这将根据索引长度添加新列,但使用 NaN 值,解决方法是使用 df.fillna(' ')

pd.DataFrame(df.to_dict() , columns = list(df.columns)+['b','c'])

希望这会有所帮助!干杯!

【讨论】:

以上是关于在将带有空字符串的新列添加到熊猫数据框时替换现有列名的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有值的新列添加到现有数据表?

如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

如何将包含现有行和新行的新列添加到表中?

如何有条件地将子字符串复制到熊猫数据框的新列中?

如何使用微软互操作将工作表开头的新列添加到现有 excel

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]