2015-09-09 2 views
6

連結機能を使用して結合しようとしているデータフレームのリストがあります。AssertionErrorの解決策:データフレームのリストで操作を連結するときのget_concat_dtypeでの無効なdtype決定

dataframe_lists = [df1, df2, df3] 

result = pd.concat(dataframe_lists, keys = ['one', 'two','three'], ignore_index=True) 

フルトレースバックは、次のとおりです。

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-198-a30c57d465d0> in <module>() 
----> 1 result = pd.concat(dataframe_lists, keys = ['one', 'two','three'], ignore_index=True) 
     2 check(dataframe_lists) 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy) 
    753      verify_integrity=verify_integrity, 
    754      copy=copy) 
--> 755  return op.get_result() 
    756 
    757 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\tools\merge.py in get_result(self) 
    924 
    925    new_data = concatenate_block_managers(
--> 926     mgrs_indexers, self.new_axes, concat_axis=self.axis, copy=self.copy) 
    927    if not self.copy: 
    928     new_data._consolidate_inplace() 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\internals.py in concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy) 
    4061             copy=copy), 
    4062       placement=placement) 
-> 4063    for placement, join_units in concat_plan] 
    4064 
    4065  return BlockManager(blocks, axes) 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\internals.py in <listcomp>(.0) 
    4061             copy=copy), 
    4062       placement=placement) 
-> 4063    for placement, join_units in concat_plan] 
    4064 
    4065  return BlockManager(blocks, axes) 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\internals.py in concatenate_join_units(join_units, concat_axis, copy) 
    4150   raise AssertionError("Concatenating join units along axis0") 
    4151 
-> 4152  empty_dtype, upcasted_na = get_empty_dtype_and_na(join_units) 
    4153 
    4154  to_concat = [ju.get_reindexed_values(empty_dtype=empty_dtype, 

C:\WinPython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\pandas\core\internals.py in get_empty_dtype_and_na(join_units) 
    4139   return np.dtype('m8[ns]'), tslib.iNaT 
    4140  else: # pragma 
-> 4141   raise AssertionError("invalid dtype determination in get_concat_dtype") 
    4142 
    4143 

AssertionError: invalid dtype determination in get_concat_dtype 

私はエラーがデータフレームの1つが空であるという事実にあると考えています。

def check(list_of_df): 

    headers = [] 
    for df in dataframe_lists: 
     if df.empty is not True: 
      continue 
     else: 
      headers.append(df.columns) 

    return headers 

空のデータフレームの場合には、それだけを返す場合は、この機能を使用することが可能である場合、私は疑問に思って:私は検証して、空のデータフレームのヘッダだけを返すために、単純な機能checkを使用しました空のデータフレームのヘッダを取得し、連結したデータフレームに追加します。出力はヘッダーの1行になります(繰り返し列名の場合は連結機能の場合と同じように)。onetwoの2つのサンプルデータソースがあります非空のデータ・セット。ここでは、空dataframeです。

私は結果CONCATENATEが列ヘッダーを持っていたいと思います...

'AT','AccountNum', 'AcctType', 'Amount', 'City', 'Comment', 'Country','DuplicateAddressFlag', 'FromAccount', 'FromAccountNum', 'FromAccountT','PN', 'PriorCity', 'PriorCountry', 'PriorState', 'PriorStreetAddress','PriorStreetAddress2', 'PriorZip', 'RTID', 'State', 'Street1','Street2', 'Timestamp', 'ToAccount', 'ToAccountNum', 'ToAccountT', 'TransferAmount', 'TransferMade', 'TransferTimestamp', 'Ttype', 'WA','WC', 'Zip' 

空のデータフレームのヘッダがこれに伴い追加される持っています行(新しい場合)

'A', 'AT','AccountNum', 'AcctType', 'Amount', 'B', 'C', 'City', 'Comment', 'Country', 'D', 'DuplicateAddressFlag', 'E', 'F' 'FromAccount', 'FromAccountNum', 'FromAccountT', 'G', 'PN', 'PriorCity', 'PriorCountry', 'PriorState', 'PriorStreetAddress','PriorStreetAddress2', 'PriorZip', 'RTID', 'State', 'Street1','Street2', 'Timestamp', 'ToAccount', 'ToAccountNum', 'ToAccountT', 'TransferAmount', 'TransferMade', 'TransferTimestamp', 'Ttype', 'WA','WC', 'Zip' 

これを行うための最良の方法についてのご意見を歓迎します。詳細下記の答えとして

、これはかなり予想外の結果である:残念ながら

、この材料の感度のために、私は実際のデータを共有することはできません。要旨に提示されているものに至るまでは、次のとおりです。私は、空のデータフレームにバインドされたメソッドを実行すると

for column_name, column in A.transpose().iterrows(): 
    AColumns= A[['ANum','RTID', 'Description','Type','Status', 'AD', 'CD', 'OD', 'RCD']] #get select columns indexed with dataframe, "A" 

新しいデータフレームのそれぞれについて
A= data[data['RRT'] == 'A'] #Select just the columns with from the dataframe "data" 
B= data[data['RRT'] == 'B'] 
C= data[data['RRT'] == 'C'] 
D= data[data['RRT'] == 'D'] 

私は、このロジックを適用:

AColumns.count 

これが出力されます:

<bound method DataFrame.count of Empty DataFrame 
Columns: [ANum,RTID, Description,Type,Status, AD, CD, OD, RCD] 
Index: []> 

最後に、私は次のようにCSVをインポート:

data=pd.read_csv('Merged_Success2.csv', dtype=str, error_bad_lines = False, iterator=True, chunksize=1000) 
data=pd.concat([chunk for chunk in data], ignore_index=True) 

私は私が提供できる他に何確かではありませんよ。連結方法は、要件を満たすために必要な他のすべてのデータフレームで機能します。私はまた、Pandas internals.pyと完全なトレースを見てきました。 NaNで列が多すぎるか、列名が重複しているか、またはdtypが混在しているか(後者はおそらく最小の原因です)。

ご指導いただきありがとうございます。

+0

最小限の例の問題を実証することは有用であろう、それが空であるそのうちの一つ、いくつかの非常に小さなデータフレーム、であり、 1つの方法は、値の行を与えることによって空ではなくすることです。値の列は、生成された連結から削除することができます。 –

+0

@TrisNefzger空のデータフレームと出力を追加しました。どうすればいい?それをダミー変数またはfillnaメソッドを使って埋めることで?さらに、その1つのインスタンスをどのように削除しますか? – ahlusar1989

+0

あなたはどんなパンダのバージョンを使用していますか? – joris

答えて

0

私はあなたのエラーを再現することはできません、それは私のためにうまく動作:連結または空のデータフレームを追加するとき

df1 = pd.read_csv('https://gist.githubusercontent.com/ahlusar1989/42708e6a3ca0aed9b79b/raw/f37738994c3285e1b670d3926e716ae027dc30bc/sample_data.csv') 
df2 = pd.read_csv('https://gist.githubusercontent.com/ahlusar1989/26eb4ce1578e0844eb82/raw/23d9063dad7793d87a2fed2275857c85b59d56bb/sample2.csv') 
df3 = pd.read_csv('https://gist.githubusercontent.com/ahlusar1989/0721bd8b71416b54eccd/raw/b7ecae63beff88bd076a93d83500eb5fa67e1278/empty_df.csv') 
pd.concat([df1,df2,df3], keys = ['one', 'two','three'], ignore_index=True).head() 

Out[68]: 
    'B' 'C' 'D' 'E' 'F' 'G' 'A' AT AccountNum AcctType ... 0 NaN NaN NaN NaN NaN NaN NaN NaN   NaN  NaN ...  
1 NaN NaN NaN NaN NaN NaN NaN NaN   NaN  NaN ...  
2 NaN NaN NaN NaN NaN NaN NaN NaN   NaN  NaN ...  
3 NaN NaN NaN NaN NaN NaN NaN NaN   NaN  NaN ...  
4 NaN NaN NaN NaN NaN NaN NaN NaN   NaN  NaN ...  

    ToAccountNum ToAccountT TransferAmount TransferMade TransferTimestamp 0   NaN   NaN    4   True  1/7/2000 0:00 
1   NaN   NaN    4   True  1/8/2000 0:00 
2   NaN   NaN    6   True  1/9/2000 0:00 
3   NaN   NaN    6   True  1/10/2000 0:00 
4   NaN   NaN    0   False  1/11/2000 0:00 

    Ttype Unnamed: 0 WA WC Zip 
0  D   4 NaN NaN NaN 
1  D   5 NaN NaN NaN 
2  D   13 NaN NaN NaN 
3  D   14 NaN NaN NaN 
4  T   25 NaN NaN NaN 

[5 rows x 41 columns] 
+0

私はオリジナルの質問を編集しました。「これを行うための最良の方法についてのフィードバックを歓迎します。 – ahlusar1989

2

私は、それが可能であることに気づきました。次の例を試してみてください。

my_headers = ['A,' 'B', 'C'] 

私は値を持つデータフレームdf_inputを持っており、ヘッダは必ずしもmy_headersと同じではありませんどこ。

9

私たちのプロジェクトの1つでは、同じエラーが発生しました。デバッグ後、問題が見つかりました。データフレームの1つに同じ名前の2つの列がありました。列の名前を変更した後、私たちの問題は解決されました。

+1

確認済み、まったく同じ問題です。エラーメッセージはより良いかもしれません –

4

これは、データフレームの1つに同じ名前の列が2つあることを意味します。

これはあなたが連結しようとしている各データフレームdfため

len(df.columns) > len(np.unique(df.columns)) 

の出力を見て、そうであるかどうかをチェックすることができます。

あなたはCounterを使用して犯人の列を識別することができますが、例えば:

from collections import Counter 
duplicates = [c for c in Counter(df.columns).items() if c[1] > 1] 
+0

それは私のためにそれをしました。 – sparrow

関連する問題