pandas dataframe - 如果是新索引,则添加新行,如果存在,则使用列数据补充索引

问题描述 投票:1回答:1

我有一个包含170个数据帧的数组,每个包含:

      gender - year
name   M/F    count

例如:

          Gender   2015
William     M      12321
George      M      19000
....       ...      ....

阵列中的每个数据帧都是不同的年份。我想要做的是将所有数据帧组合到一个数据帧。随着年份的不同,一些名称出现而其他名称消失,因此并非所有数据帧都具有相同的结构(不同的行数)。

tldr我想要的(来源:https://pandas.pydata.org/pandas-docs/stable/merging.html):

enter image description here

但是使用这种方法我得到错误:

ValueError: Shape of passed values is (274, 96313), indices imply (274, 96174)

这是因为我的数据帧(与示例不同)具有不同的行数(我认为)。

这是我的完整代码:

from zipfile import ZipFile

import pandas as pd
zip_file = ZipFile('names.zip')


df = pd.DataFrame()
dfs = []
with zip_file as f:
    for name in f.namelist():

            df1 = pd.read_csv(zip_file.open(name), sep=',',names=['Gender',name])  #Name = year
            df.append(df1)
            print(newDf)
            dfs.append(df1)

result = pd.concat(dfs,axis=1)
print(result.head())

香港专业教育学院尝试过追加,合并和连续,但他们似乎没有做我正在寻找的东西。我发现这个错误的解决方案并不直接适用于我的情况,因为我正在处理大量的数据帧,而且我无法让它们与我的代码一起工作。

python pandas dataframe merge
1个回答
2
投票

有问题索引中的某些值是重复的,因为有些名称应该是malefemale也是Abbie

因此解决方案非常简单 - 在names中只向read_csv添加一个值,第二列中的第一个值将转换为unique MultiIndex

还使用拼接更改了列名称 - 删除了前3个和后4个字符。

from zipfile import ZipFile
zip_file = ZipFile('names1.zip')

dfs = []
with zip_file as f:
    for name in f.namelist():
        df1 = pd.read_csv(zip_file.open(name), sep=',',names=[name[3:-4]])
        dfs.append(df1)

result = pd.concat(dfs,axis=1)

print(result.head(10))


           1884  1885  1886   1887   1888   1889   1890   1891   1892   1893  \
Aaron   M  97.0  88.0  86.0   78.0   90.0   85.0   96.0   69.0   95.0   81.0   
Ab      M   NaN   6.0   NaN    5.0    NaN    NaN    NaN    NaN    NaN    NaN   
Abb     M   5.0   NaN   NaN    NaN    NaN    NaN    6.0    5.0    NaN    NaN   
Abbie   F  98.0  88.0  84.0  104.0  137.0  107.0  140.0  124.0  119.0  115.0   
        M   NaN   NaN   NaN    5.0    NaN    NaN    NaN    5.0    NaN    NaN   
Abbott  M   NaN   NaN   NaN    NaN    6.0    NaN    NaN    NaN    NaN    NaN   
Abby    F   6.0   5.0   7.0    5.0    9.0    8.0    6.0   12.0    6.0   10.0   
Abe     M  45.0  47.0  50.0   37.0   46.0   39.0   49.0   40.0   53.0   43.0   
Abel    M  14.0   6.0  16.0   11.0    8.0    9.0   14.0   10.0    8.0   13.0   
Abelina F   NaN   NaN   NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN   

           ...     1904  1905  1906   1907   1908   1909   1910   1911   1912  \
Aaron   M  ...    117.0  96.0  96.0  130.0  114.0  142.0  145.0  187.0  303.0   
Ab      M  ...      NaN   NaN   NaN    NaN    NaN    NaN    NaN    NaN    NaN   
Abb     M  ...      NaN   NaN   NaN    NaN    NaN    NaN    NaN    NaN    NaN   
Abbie   F  ...     80.0  73.0  72.0   79.0   84.0   57.0   79.0   77.0   90.0   
        M  ...      NaN   5.0   NaN    NaN    NaN    NaN    8.0    NaN    NaN   
Abbott  M  ...      NaN   NaN   NaN    NaN    NaN    5.0    NaN    8.0    8.0   
Abby    F  ...      NaN   NaN   6.0    5.0    NaN    8.0    6.0   13.0    8.0   
Abe     M  ...     52.0  65.0  50.0   65.0   57.0   67.0   74.0   94.0  172.0   
Abel    M  ...     10.0   6.0  11.0   10.0   15.0   16.0   11.0   30.0   40.0   
Abelina F  ...      NaN   NaN   NaN    NaN    NaN    NaN    NaN    NaN    NaN   

            1913  
Aaron   M  417.0  
Ab      M    NaN  
Abb     M    5.0  
Abbie   F  121.0  
        M    7.0  
Abbott  M    5.0  
Abby    F   11.0  
Abe     M  202.0  
Abel    M   48.0  
Abelina F    NaN  

[10 rows x 30 columns]
© www.soinside.com 2019 - 2024. All rights reserved.