0

我有一个非常大的数据集从 excel 导入到 pandas 数据框中。我在下面做了一个简短的演示示例。这个 df 是我导入的结果。df

        A   B   C  A.1  B.1  C.1  A.2  B.2  C.2
Vehicle                                          
car       4   5   5  NaN  NaN  NaN  NaN  NaN  NaN
bike    NaN NaN NaN    3    4    5  NaN  NaN  NaN
bus     NaN NaN NaN  NaN  NaN  NaN    2    3    4
car       4   4   3  NaN  NaN  NaN  NaN  NaN  NaN

在导入到 pandas 时,我用后缀重新标记了列名。但在我的 Excel 表中,它们是相同的。(只有 A、B、C)我想要的结果是:

df:
         A  B  C
Vehicle         
car      4  5  5
bike     3  4  5
bus      2  3  4
car      4  4  3

有人可以帮我解决这个问题吗?

我制作了一个新的数据框以获得更好的解释

     Model   A   B   C   D  A.1  B.1  C.1  D.1  A.2  B.2  C.2  D.2  A.3  B.3  \
0  34005   1   3   4   4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   
1   1001 NaN NaN NaN NaN    3    4    5    3  NaN  NaN  NaN  NaN  NaN  NaN   
2   2003 NaN NaN NaN NaN  NaN  NaN  NaN  NaN    1    2    3    3  NaN  NaN   
3  28008 NaN NaN NaN NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN    1    2   
4  28008 NaN NaN NaN NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   

   C.3  D.3  A.4  B.4  C.4  D.4  
0  NaN  NaN  NaN  NaN  NaN  NaN  
1  NaN  NaN  NaN  NaN  NaN  NaN  
2  NaN  NaN  NaN  NaN  NaN  NaN  
3    3    3  NaN  NaN  NaN  NaN  
4  NaN  NaN    1    2    3    3  

没有让它在更大的范围内工作

ds_indexed

Out[350]:
       a  b  c  d  e  f  g a.1 b.1 c.1 d.1 e.1 f.1 g.1
model                                                 
30                                                    
28                           5   5   5   4   5   5   4
11                                                    
18                                                    
35                                                    
30                           5   5   5   5   5   5   3
30                           3   3   4   4   4   4   4
27                           5   5   5   4   5   5   3
34                                                    
30                                                    
2                            5   5   5   3   4   5   5
28                                                    
10                                                    
15                                                    
30                                                    
85                                                    
39                                                    
33                           5   4   4   4   3   5   3
3                            5   4   4   4   4   5   4
10                           3   3   3   2   3   4   3
3                            3   4   4   4   3   4   4
9      5  4  5  3  5  5  3

main_cols = ['a','b', 'c', 'd', 'e', 'f', 'g']
new_ds = ds_indexed[main_cols]

for main_col in main_cols:
    suffix_cols = [col for col in ds_indexed.columns 
                   if col.startswith(main_col) and col != main_col]
    for suffix_col in suffix_cols:
        new_ds[main_col] = new_ds[main_col].combine_first(ds_indexed[suffix_col])


new_ds
Out[353]:
   a  b  c  d  e  f  g
model                     
30                        
28                        
11                        
18                        
35                        
30                        
30                        
27                        
34                        
30                        
2                         
28                        
10                        
15                        
30                        
85                        
39                        
33                        
3                         
10                        
3                         
9      5  4  5  3  5  5  3
I can not get all the values in the new dataframe, help

ds_indexed.info()
<class 'pandas.core.frame.DataFrame'>
Index: 22 entries, 30.0 to 9.0
Data columns (total 14 columns):
a      22  non-null values
b      22  non-null values
c      22  non-null values
d      22  non-null values
e      22  non-null values
f      22  non-null values
g      22  non-null values
a.1    22  non-null values
b.1    22  non-null values
c.1    22  non-null values
d.1    22  non-null values
e.1    22  non-null values
f.1    22  non-null values
g.1    22  non-null values
dtypes: object(14)
4

2 回答 2

2

假设您的值中没有 nans,您可以执行以下操作:

>>> new_df = df.apply(lambda x: pd.Series(x.dropna().values), axis=1)
>>> new_df.columns = ['A', 'B', 'C']
>>> new_df
Out[537]:
       A    B   C
Vehicle         
car    5     5   4
bike   3     4   5
bus    2     3   4
car    4     3   4

如果不是这种情况,那么您可以在轴名称上使用一些逻辑:

main_cols = ['A', 'B', 'C']
new_df = df[main_cols]

for main_col in main_cols:
    suffix_cols = [col for col in df.columns 
                   if col.startswith(main_col) and col != main_col]
    for suffix_col in suffix_cols:
        new_df[main_col] = new_df[main_col].combine_first(df[suffix_col])
于 2013-09-09T09:05:01.587 回答
1

您可以通过函数(例如第一个字符)按列名分组:

In [11]: df.groupby(lambda x: x[0],  axis=1).sum()
Out[11]: 
      A  B  C
car   4  5  5
bike  3  4  5
bus   2  3  4
car   4  4  3

注意:我之前的答案适用于 0.13,您可以在其中重命名列(仅查看第一个字符)*:

In [21]: df
Out[21]: 
       A   B   C  A.1  B.1  C.1  A.2  B.2  C.2
car    4   5   5  NaN  NaN  NaN  NaN  NaN  NaN
bike NaN NaN NaN    3    4    5  NaN  NaN  NaN
bus  NaN NaN NaN  NaN  NaN  NaN    2    3    4
car    4   4   3  NaN  NaN  NaN  NaN  NaN  NaN

In [22]: df.rename_axis(lambda x: x[0], axis=1)
Out[22]: 
       A   B   C   A   B   C   A   B   C
car    4   5   5 NaN NaN NaN NaN NaN NaN
bike NaN NaN NaN   3   4   5 NaN NaN NaN
bus  NaN NaN NaN NaN NaN NaN   2   3   4
car    4   4   3 NaN NaN NaN NaN NaN NaN

然后按列分组求和:

In [23]: df.rename_axis(lambda x: x[0], axis=1).groupby(level=0, axis=1).sum()
Out[23]: 
      A  B  C
car   4  5  5
bike  3  4  5
bus   2  3  4
car   4  4  3

*在 0.12 及更早版本中,它不会让您重命名为非唯一列,(正如@joris 指出的那样)相反,您可以直接重命名:

df.columns = df.columns.map(lambda x: x[0])
于 2013-09-10T14:32:37.393 回答