2017-08-16 30 views
1

複数の年の値がセミコロンで区切られた列を含むPandas DataFrameに読み込んだCSVファイルがあります。Pandas DataFrameの文字列から最小年と最大年を抽出します

文字列から最小値と最大値を抽出し、それぞれを新しい列に保存する必要があります。

最小値と最大値を印刷できますが、新しい列に保存された各行から正しい値を取得できないようです。

ご迷惑をおかけして申し訳ありません。

サンプルデータフレームは:

ここ
x = df['years'].notnull() 

for row in df['years'][x].str.split(pat=';'): 
    lst = list() 
    for item in row: 
     lst.append(int(item)) 
    print('Min=',min(lst),'Max=',max(lst)) 

Min= 2000 Max= 2005 
Min= 2003 Max= 2005 
Min= 2015 Max= 2015 
Min= 2012 Max= 2014 

は、私が試した方法は次のとおりです。

  id           years minyear maxyear 
0 1473-2262 2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005 2000.0 2005.0 
1 2327-9214        2003; 2004; 2005 2003.0 2005.0 
2 1949-8349           2015 2015.0 2015.0 
3 2375-6314            NaN  NaN  NaN 
4 0095-6562          2012; 2014 2012.0 2014.0 

は私が最小値と最大値を印刷することができます。

import pandas as pd 
import numpy as np 

raw_data = {'id': ['1473-2262', '2327-9214', '1949-8349', '2375-6314', 
        '0095-6562'], 
      'years': ['2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005', 
         '2003; 2004; 2005', '2015', np.nan, '2012; 2014']} 
df = pd.DataFrame(raw_data, columns = ['id', 'years']) 

これは私が必要とするデータフレームであります新しい列に値を取得する:

x = df['years'].notnull() 

for row in df['years'][x].str.split(pat=';'): 
    lst = list() 
    for item in row: 
     lst.append(int(item)) 
    df['minyear']=min(lst) 
    df['maxyear']=max(lst) 

最後の行の値のみが新しい列に保存されます。

   id           years minyear maxyear 
0 1473-2262 2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005  2012  2014 
1 2327-9214        2003; 2004; 2005  2012  2014 
2 1949-8349           2015  2012  2014 
3 2375-6314            NaN  2012  2014 
4 0095-6562          2012; 2014  2012  2014 

答えて

2

私はその後floatにキャスト、新しいDataFrameためexpand=Truestr.splitが必要だと思います。

インデックス値は同じであるので、新しい列を割り当てる:jezraelによって提案されたものと同様

df1 = df['years'].str.split('; ', expand=True).astype(float) 
df = df.assign(maxyear=df1.max(axis=1),minyear=df1.min(axis=1)) 
#same as 
#df['maxyear'], df['minyear'] = df1.min(axis=1), df1.max(axis=1) 
print (df) 
      id           years maxyear minyear 
0 1473-2262 2000; 2001; 2002; 2003; 2004; 2004; 2004; 2005 2000.0 2005.0 
1 2327-9214        2003; 2004; 2005 2003.0 2005.0 
2 1949-8349           2015 2015.0 2015.0 
3 2375-6314            NaN  NaN  NaN 
4 0095-6562          2012; 2014 2012.0 2014.0 
0

溶液が、シリーズへの変換を使用して。 警告:この解決策はうまくスケールされません。

years = df.years.str.split(";").apply(pd.Series).astype(float)   
#0  1  2  3  4  5  6  7 
#0 2000.0 2001.0 2002.0 2003.0 2004.0 2004.0 2004.0 2005.0 
#1 2003.0 2004.0 2005.0  NaN  NaN  NaN  NaN  NaN 
#2 2015.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
#3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN 
#4 2012.0 2014.0  NaN  NaN  NaN  NaN  NaN  NaN 
df['maxyear'], df['minyear'] = years.min(axis=1), years.max(axis=1) 
+0

私のソリューションはあなたの2倍です。あまりにも悪くはありません:) – DyZ

+0

いいえ、ちょうど5.行の数に比例して直線的に拡大しませんか? – DyZ

+0

@jezraelそうです。私は、なぜ、不思議です。 – DyZ

関連する問題