代码之家  ›  专栏  ›  技术社区  ›  Laurent S

选择系列中的某些值作为标题

  •  4
  • Laurent S  · 技术社区  · 7 年前

    Japan
    valA
    valB
    Ghana
    valC
    valD
    ...
    

    Japan    valA
    Japan    valB
    Ghana    valC
    Ghana    valD
    

    我确信这个问题已经有答案了,但是我还没有找到正确的关键词来解决这个问题。

    def get_country(row):
        if #decide if it's a country name:
            return row[0]
    df['country'] = df.apply(get_country, axis=1).fillna(method='ffill')
    

    在清理数据时,这似乎是一个相当常见的用例,是否有一种标准/更好的方法?

    3 回复  |  直到 7 年前
        1
  •  4
  •   cs95 abhishek58g    7 年前

    我可以让你开始使用 map ffill .

    def is_country(x): 
        # TODO - fill in the logic for this stub.
        return x in {'Japan', 'Ghana'}
    
    df
    
           A
    0  Japan
    1   valA
    2   valB
    3  Ghana
    4   valC
    5   valD
    
    
    df.assign(B=df['A'].where(df['A'].map(is_country)).ffill()).query('A != B')
    
          A      B
    1  valA  Japan
    2  valB  Japan
    4  valC  Ghana
    5  valD  Ghana
    

    你可以使用像这样的软件包 pycountry

    import pycountry
    countries = {x.name for x in pycountry.countries}  # Initialise a set.
    
    def is_country(x): 
        return x in countries
    

    但是,使用此定义,您可以将代码简化为,

    df.assign(B=df['A'].where(df['A'].isin(countries)).ffill()).query('A != B')
    

    is_country 完全起作用。

        2
  •  4
  •   Vaishali    7 年前

    使用提取物

    new_df = df['col'].str.extract('(val.*)?(.*)').replace('', np.nan).rename(columns = {1:'Country', 0:'Value'})
    new_df['Country'] = new_df['Country'].ffill()
    new_df.dropna(inplace = True)
    
    
        Value   Country
    1   valA    Japan
    2   valB    Japan
    4   valC    Ghana
    5   valD    Ghana
    
        3
  •  0
  •   jpp    7 年前

    groupby + pd.concat . 你可以定义 countries 明确或使用您最喜欢的源代码。

    df = pd.DataFrame({'col': ['Japan', 'valA', 'valB', 'Ghana', 'valC', 'valD']})
    countries = ['Japan', 'Ghana']
    
    grouper = df['col'].groupby(df['col'].isin(countries).cumsum())    
    dfs = (pd.DataFrame({'Country': df_ctry.iat[0], 'Value': df_ctry.iloc[1:]}) \
           for _, df_ctry in grouper)
    
    res = pd.concat(dfs, ignore_index=True)
    
    print(res)
    
      Country Value
    0   Japan  valA
    1   Japan  valB
    2   Ghana  valC
    3   Ghana  valD