【问题标题】:Fill dataframe is column name match填充数据框是列名匹配
【发布时间】:2020-04-29 23:04:07
【问题描述】:

我有一个 df df1,其中 N 列填充值,另一个 df2 为空,带有 M 列 (M > N)。 我有 2 个列表,代表 df1 的所有列名和源 df2 中的匹配列名,已排序。

例如:list1[0] -> list2[0]

我可以用旧的 for 循环填充从​​ df1df2 的数据,我希望以更 Pythonic/pandas/功能性的方式做同样的事情。

df1
    A   B   C   D
0   94  18  47  1
1   75  40  30  97
2   14  56  63  89
3   28  74  25  59
list1 = ["A", "B", "C", "D"]
list2 = ["Z1", "Z3", "Z4", "Z8"]

预期输出:

df2
    Z1  Z2  Z3  Z4  Z5  Z6  Z7  Z8
0   94      18  47               1
1   75      40  30              97
2   14      56  63              89
3   28      74  25              59

【问题讨论】:

    标签: python pandas dataframe rename


    【解决方案1】:

    想法是rename 列名dict 由列的压缩创建,然后使用DataFrame.reindex 第二个DataFrame 的列名:

    df = df1.rename(columns=dict(zip(list1, list2))).reindex(df2.columns, axis=1)
    print (df)
       Z1  Z2  Z3  Z4  Z5  Z6  Z7  Z8
    0  94 NaN  18  47 NaN NaN NaN   1
    1  75 NaN  40  30 NaN NaN NaN  97
    2  14 NaN  56  63 NaN NaN NaN  89
    3  28 NaN  74  25 NaN NaN NaN  59
    

    详情

    print (dict(zip(list1, list2)))
    {'A': 'Z1', 'B': 'Z3', 'C': 'Z4', 'D': 'Z8'}
    
    print (df1.rename(columns=dict(zip(list1, list2))))
       Z1  Z3  Z4  Z8
    0  94  18  47   1
    1  75  40  30  97
    2  14  56  63  89
    3  28  74  25  59
    

    【讨论】:

    • 太棒了!我忘记了 args columns 可以采用像 dict 这样的可迭代对象。
    【解决方案2】:

    试试这个:

    import pandas as pd
    
    # your code
    
    df2 = df1.copy()
    df2.columns = ["Z1", "Z3", "Z4", "Z8"]
    df2["Z2"] = pd.np.NaN
    df2["Z5"] = pd.np.NaN
    df2["Z6"] = pd.np.NaN
    df2["Z7"] = pd.np.NaN
    

    【讨论】:

      猜你喜欢
      • 2022-11-13
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多