41670

[code]

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame({'Information1' : [19, 'Shopping','HANA', 'Canada'],
                   'Information2' : ['books', 24, 'games', 'MARY'],
                   'Information3' : ['JACK', 'Italy', 'Japan', 23],
                   'Information4' : ['Australia', 'MARCO', 25, 'movies']},
                   index = {'Person1','Person2','Person3', 'Person4'}
                   )
    
[/code]

このdf1をprintすると、以下のようになります。

[code]

            Information1    Information2    Information3    Information4
    Person3    19              books           JACK           Australia
    Person4   Shopping          24             Italy           MARCO
    Person1   HANA             games           Japan            25
    Person2   Canada            MARY            23             movies
    
[/code]

このPerson1,Person2, Person3,
Person4の列の中から大文字のみで示されている名前の要素のみ取り出す方法はあるでしょうか(str.upperを使う方法もうまく思いつきません)  
理想としては、

[code]

            Name
    Person3 JACK
    Person4 MARCO
    Person1 HANA
    Person2 MARY
    
[/code]

のようなかんじです。もし何か有効な方法があれば教えていただきたいです。よろしくお願い致します。


CC BY-SA 3.0
2018-02-12T09:23:54.647
41669
2018-02-12T16:23:27.767
2018-02-12T13:31:01.890
27294
27294
question
python pandas
データフレームの中の大文字で書かれた要素のみ抽出する


データフレームを、

[code]

    df1 = pd.DataFrame({'Person1' : [19, "books", "JACK", "Australia"],
                    'Person2' : ["shopping",24 ,"Italy" , "MARCO"],
                    'Person3' : ["HANA", "games","Japan", 25],
                    'Person4' : ["Canada","MARY",23 ,"movies"]}
                      )
    df1 = df1.T
    print(df1)
    
                    0      1      2          3
    Person1        19  books   JACK  Australia
    Person2  shopping     24  Italy      MARCO
    Person3      HANA  games  Japan         25
    Person4    Canada   MARY     23     movies
    
[/code]

という構造だとして、

  1. 左の列から順番に探して一番最初に見つけた大文字を取得する
  2. 大文字が見つからなければ`None`を入れる

と言う条件なら、`hasattr`を使いながら下記のような出来るかと思います。

[code]

    Name = []
    for row in df1.itertuples():
        for item in row:
            if hasattr(item, "isupper") and item.isupper():
                Name.append(item)
                break
        else:
            Name.append(None)
    df1["Name"] = Name
    
[/code]

ワンライナーでできそうな気もしますが、そこまではちょっと分かりません。


CC BY-SA 3.0
2018-02-12T09:56:02.080
41670
2018-02-12T16:23:27.767
2018-02-12T16:23:27.767
26311
26311
41669
answer