所以,我有這個代碼合並dataframes pyspark熊貓。我希望離開的索引dataframe持續整個連接。所以別人的建議後想保持索引合並後,我把指數前一列合並,然後把它帶回指數在合並和刪除索引名稱。
進口pyspark。熊貓作為ps def merge_dataframes(左= None,右= None, =“內心”,如何在= None, left_on = None, right_on = None, left_index = False, right_index = False): merging_left = left.copy () merging_left [' weird_index_name '] = merging_left。指數new_df = merging_left。合並(右,=,=,left_on = left_on right_on = right_on後綴= (“_dupe_right), left_index = left_index right_index = right_index) returning_df = new_df.set_index (“weird_index_name”) returning_df.index.name =沒有返回returning_df df_1 = ps.DataFrame ({“join_column”: (1、2、3、4),“value1”: [A, B, C, D ')},指數= [‘Index1’,‘Index2’,‘Index3’, ' Index4 ']) df_2 = ps.DataFrame ({join_column: [1、2、3、4、5),“value2”: [A, B, C, D ', ' e ']}) df_3 = ps.DataFrame ({join_column: [1、2、3、4、6、7],“value3”: [1.1, 2.2, 3.3, 4.4, 6.6, 7.7)}) input_list = [df_1、df_2 df_3] expected_result = ps.DataFrame ({“join_column”: (1、2、3、4),“value1”: [A, B, C, D '),“value2”: [A, B, C, D '),“value3”:(1.1, 2.2, 3.3, 4.4)},指數= [‘Index1’,‘Index2’,‘Index3’, ' Index4 ']) final_df = input_list[0]的next_df input_list [1:]: final_df = merge_dataframes(左= final_df右= next_df =“左”,如何在= join_column)打印(final_df)
這兩個合並dataframes很實用,但是隻要我有一個列表的dataframes合並在一起使用一個for循環。我得到這個錯誤:
AnalysisException回溯(去年)最近調用<命令- 1950358519842329 > <模塊> 42 final_df = input_list[0] 43的next_df input_list [1:]: - - - - - - > 44 final_df = merge_dataframes(左= final_df右= next_df =“左”,如何在= join_column) 45 46打印(final_df) <命令- 1950358519842329 > merge_dataframes(左,右,上,left_on, right_on, left_index, right_index) 7 merging_left [' weird_index_name '] = merging_left。指數8 - - - - - > 9 new_df = merging_left。合並(右,=,=,left_on = left_on right_on = right_on後綴= (“_dupe_right), 10 left_index = left_index right_index = right_index) 11 /磚/火花/ python / pyspark /熊貓/ usage_logging / __init__。py在包裝器(* args, * * kwargs) 192年開始= time.perf_counter(193年)嚐試:- - > 194 res = func (* args, * * kwargs) 195記錄器。log_success (196 class_name, function_name time.perf_counter()——開始,簽名/磚/火花/ python / pyspark /熊貓/框架。py合並(自我,如何,left_on right_on, left_index, right_index,後綴)7655)7656 - > 7657 left_internal = self._internal。resolved_copy 7658 right_internal =解決(右。_internal,“正確的”)7659 /磚/火花/ python / pyspark /熊貓/跑龍套。py wrapped_lazy_property(自我)578 def wrapped_lazy_property(自我):579如果不是hasattr(自我,attr_name):——> 580 setattr(自我、attr_name fn(自我))581年返回getattr(自我,attr_name) 582 /磚/火花/ python / pyspark /熊貓/內部。py resolved_copy(自我)1169回歸自我。複製(1170 spark_frame = sdf - > 1171 index_spark_columns = [scol_for sdf,坳坳的自我。index_spark_column_names], 1172 data_spark_columns = [scol_for sdf,坳坳的自我。data_spark_column_names], 1173) /磚/火花/ python / pyspark /熊貓/內部。py 1169年< listcomp >(0)回歸自我。複製(1170 spark_frame = sdf - > 1171 index_spark_columns = [scol_for sdf,坳坳的自我。index_spark_column_names], 1172 data_spark_columns = [scol_for sdf,坳坳的自我。data_spark_column_names], 1173) /磚/火花/ python / pyspark /熊貓/跑龍套。py scol_for (sdf, column_name) 590 def scol_for (column_name自衛隊:SparkDataFrame: str) - >專欄:591”“”返回給定列名火花列。””“- - > 592返回自衛隊“{}”.format (column_name)] 593 594 /磚/ / python / pyspark / sql / dataframe火花。py 1775年__getitem__(自我,項)”“如果isinstance(項目,str): 1776 - > 1777 jc = self._jdf.apply(項目)1778年返回列(jc) 1779 elif isinstance(項目、列):/磚/火花/ python / lib / py4j-0.10.9.1-src.zip / py4j / java_gateway。py __call__(自我,* args) 1302 1303回答= self.gateway_client.send_command(命令)- > 1304 return_value = get_return_value(1305回答,自我。gateway_client,自我。target_id, self.name) 1306 /databricks/spark/python/pyspark/sql/utils.py in deco(*a, **kw) 121 # Hide where the exception came from that shows a non-Pythonic 122 # JVM exception message. --> 123 raise converted from None 124 else: 125 raise AnalysisException: Reference 'weird_index_name' is ambiguous, could be: weird_index_name, weird_index_name.
從我的理解這表明有另一列叫做“weird_index_name”。然而,顯示dataframe進入合並之前我得到dataframe隻有一列“weird_index_name”這兩個調用的函數。
這讓我覺得“weird_index_name”後繼續作為索引名稱:
returning_df = new_df.set_index (weird_index_name) returning_df.index.name =沒有
然而,合並後的打印returning_df.index.name返回沒有前兩個dataframes,之前第二個調用的函數。在印刷時也如此前merging_left.index.name第二個調用的函數。
如果我介紹這條線合並前:
print (merging_left.index.to_list ())
前兩個dataframes作品的合並,然後我得到這個錯誤當試圖加入第三(第二調用的函數)在這條線:
長度不匹配:預期的軸有5個元素,新值有4個元素
這讓我相信,有一個問題與指數和“weird_index_name”依然存在。
任何幫助將不勝感激!
這工作對我來說:
熊貓作為ps def merge_dataframes導入(左= None,右= None, =“內心”,如何在= None, left_on = None, right_on = None, left_index = False, right_index = False): merging_left = left.copy () merging_left [' weird_index_name '] = merging_left。指數new_df = merging_left。合並(右,=,=,left_on = left_on right_on = right_on後綴= (“_dupe_right), left_index = left_index right_index = right_index) returning_df = new_df.set_index (“weird_index_name”) returning_df.index.name =沒有返回returning_df df_1 = ps.DataFrame ({“join_column”: (1、2、3、4),“value1”: [A, B, C, D ')},指數= [‘Index1’,‘Index2’,‘Index3’, ' Index4 ']) df_2 = ps.DataFrame ({join_column: [1、2、3、4、5),“value2”: [A, B, C, D ', ' e ']}) df_3 = ps.DataFrame ({join_column: [1、2、3、4、5、6],“value3”: [1.1, 2.2, 3.3, 4.4, 6.6, 7.7)}) input_list = [df_1、df_2 df_3] #打印(類型(input_list [0])) final_df = input_list[0] #打印(final_df) next_df input_list [1:]: final_df = merge_dataframes(左= final_df右= next_df =“左”,如何在= join_column)打印(final_df)
這就跟你問聲好!
我試著調試你的代碼和我認為的錯誤隻是因為你的列存在於兩個實例dataframe內循環。
我試著添加一些額外的調試線在你merge_dataframes功能:
執行後,我還剩下的代碼執行但我之前停止循環。
而不是運行循環,我打破了代碼並嚐試運行它。
首先讓加載第一個df:
然後可以使用merge試圖使用第一個元素(1)。
我們可以看到“weird_index_name”創建df。
它為什麼會失敗,我將執行final_df = input_list[0]再次重新啟動df,然後在第二個元素:運行merge fi
你可以看到,在這兩種情況下中間dataframe創建相同的列“weird_index_name”。
如果你試圖運行您的原始代碼,在第三次迭代中已經有與本專欄dataframe這也解釋了為什麼你得到錯誤:引用“weird_index_name”是模棱兩可的