【问题标题】:Columns issue with Python, Pandas and Excel;;Python、Pandas 和 Excel 的列问题;;
【发布时间】:2020-06-18 00:50:31
【问题描述】:

我正在尝试使用 python 和 pandas 处理 Excel 文件。这个文件有大量的列和行,但我会尝试使用这个例子来简化:

Name    Age  Nationality    Name1   Age1    Nationality1    Name2   Age2    Nationality2
Jane    32   Canada                     
Pedro   25   Spain                      
                            Lucas    30      Italy          
                             Ana     23      Germany            
                                                            Pedro    43      Brazil
                                                            Lucas    32      Mexico

My excel example

因此,在此示例中,我有以下列:姓名、年龄和国籍。但是,我也有 Name1、Age1 和 Nationality1。因为我想按其值过滤它,所以它不起作用,因为我必须过滤每一个:Name、Name1 和 Name2。

我认为这可能是转换为不同字典并尝试过滤这些字典的一个选项。但考虑到列和行的数量,我想这需要更长的时间。

如果我可以重命名列,我也很困难,但是我搜索并发现它必须具有唯一的名称。如果我错了,请纠正我。

有人对此有解决方案吗?会很有帮助。 提前谢谢

【问题讨论】:

  • always 是否按顺序排列 - 即 Name, Age, Nationality ?会不会是Name, Age, Nationality, Nationality1 ,Age1, Name1
  • 您能否发布一个您希望输出的示例。
  • @Datanovice,不完全是..我想我的问题可以更清楚..抱歉。但是假设我们也可以有“昵称,性别”。但那些不会重复,它们在序列之间:“姓名,年龄,国籍”“昵称”“姓名1,年龄1,国籍1”“性别”“姓名2 , 年龄2, 国籍2"
  • @Chris,我希望只有一行用于 Name,另一行用于 Age,另一行用于 Nationality.. 这样我就可以按名称过滤,例如:“Pedro”。然后我会有两个结果。一个来自西班牙,有 25 岁,另一个来自巴西,有 43 岁。如果我想知道有多少人被称为 pedro,并且在这个数据表中来自西班牙,我可以再次按年龄或国籍进行过滤。
  • @Phil 你能添加一些模仿你上面所说的数据样本吗?

标签: python excel pandas


【解决方案1】:

您可以使用bfill(axis=1) 将每行中的第一个非空值复制到前一列。在循环的第一次迭代中,所有 Name 列都将成功填充。如果您将其设置为索引,然后用 NaN 替换 df 中所有其他出现的这些名称,您可以在其余列上重复该过程并最终得到您想要的。

import pandas as pd
import numpy as np

df = pd.read_csv('name_age_nationality.csv')

    Name   Age Nationality  Name1  Age1 Nationality1  Name2  Age2 Nationality2
0   Jane  32.0      Canada    NaN   NaN          NaN    NaN   NaN          NaN
1  Pedro  25.0       Spain    NaN   NaN          NaN    NaN   NaN          NaN
2    NaN   NaN         NaN  Lucas  30.0        Italy    NaN   NaN          NaN
3    NaN   NaN         NaN    Ana  23.0      Germany    NaN   NaN          NaN
4    NaN   NaN         NaN    NaN   NaN          NaN  Pedro  43.0       Brazil
5    NaN   NaN         NaN    NaN   NaN          NaN  Lucas  32.0       Mexico

for x in ['Name','Age','Nationality']:
   df = df.bfill(axis=1).set_index(x)
   df = df.replace(df.index.values,np.nan).reset_index()

df[['Name','Age','Nationality']]

输出

    Name Age Nationality
0   Jane  32      Canada
1  Pedro  25       Spain
2  Lucas  30       Italy
3    Ana  23     Germany
4  Pedro  43      Brazil
5  Lucas  32      Mexico

【讨论】:

    【解决方案2】:

    您可以将所有列标题标题放入一个列表中。你能更具体地说明你想要什么最终结果吗?

    list(my_dataframe.columns.values)
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2017-06-02
      • 2017-01-04
      • 2019-05-11
      相关资源
      最近更新 更多