如何解决如何使用apply和lambda
我有一个函数,可以将2d Pandas.DataFrame展平为具有Pandas.MultiIndex的单列Pandas.DataFrame。它的工作原理是将每一列附加到Python.list上,然后从该列表构造数据框。但是,我想看看是否可以使用NumPy.array而不是Python.list使其更快地工作。
与Numpy数组一起使用时,最接近的返回正确的结构,但返回错误的值-不是按错误的顺序排列正确的值,而是输入中未包含的其他一些值。在下面的测试数据帧上,它只能运行一次,但是如果再次运行该函数则无法运行,并且永远无法在我的实际数据帧上运行。
使用Python列表始终可以在测试数据帧上使用;您可以一遍又一遍地重新运行print(df_to_multidx_df(test_df))
(请参见下文)。但是,它只能在真正的数据帧上第一次使用。它将在适当的位置修改输入数据框,因此无法重新运行该语句。
(第二,关于同一函数的相同部分,我想使用apply()而不是applymap(),因为我认为它可能会更快,但我根本无法使它工作。 )
这是使用NumPy数组会发生的情况。
import pandas as pd
import numpy as np
def df_to_multidx_df(df: pd.DataFrame,cols_idx1_name: str = 'Previous Columns',idx_idx2_name: str = 'Previous Index',val_col_name: str = 'Values') -> pd.DataFrame:
'''Takes 2d dataframe (df) with a single-level index and one or more
single-level columns. All df values must be the same type.
Parameters:
df: 2d dataframe with single-level index and one or more
single-level columns. All df values must be the same type.
cols_idx1_name: 1st index title for returned dataframe; index is df
column names.
idx_idx2_name: 2nd index title for returned dataframe; index is df
index.
Returns:
a 2d dataframe with a MultiIndex constructed of table_df column
names and index values. Has a single column with field values that are
all df columns strung end to end.'''
# create MultiIndex from product of index values and column names
mult_idx = pd.MultiIndex.from_product([df.columns,df.index],names=[cols_idx1_name,idx_idx2_name])
# val_list = []
# df.applymap(lambda x : val_list.append(x))
# return pd.DataFrame(val_list,index=mult_idx,columns=[val_col_name])
# Use a NumPy array instead of a list,to maybe speed up.
val_arr = np.empty(shape=[len(df.columns) * len(df.index)],dtype=df.dtypes.iloc[0])
print(val_arr)
df.applymap(lambda x : np.append(val_arr,x))
return pd.DataFrame(val_arr,columns=[val_col_name])
test_df = pd.DataFrame({'col1': [1.0,2.0,3.0,4.0],'col2': [2.0,4.0,5.0],'col3': [3.0,5.0,6.0]},index = ['row1','row2','row3','row4'])
print(df_to_multidx_df(test_df))
# array([1.,2.,3.,4.,5.,6.])
# Values
# Previous Columns Previous Index
# col1 row1 1.0
# row2 2.0
# row3 3.0
# row4 4.0
# col2 row1 2.0
# row2 3.0
# row3 4.0
# row4 5.0
# col3 row1 3.0
# row2 4.0
# row3 5.0
# row4 6.0
print(test_df)
# col1 col2 col3
# row1 1.0 2.0 3.0
# row2 2.0 3.0 4.0
# row3 3.0 4.0 5.0
# row4 4.0 5.0 6.0
到目前为止很好,但是函数中的测试打印语句print(val_arr)
应该打印一个空数组,对吗?但是,即使语句在附加发生之前,它也会在附加值之后打印该数组。麻烦。
即使重新启动内核并重新运行单元后,再次运行该函数也常常使值混乱。有时它有一堆带有几个浮点数的NaN,或者有时它的值非常小(带有符号)。而且,它永远无法在我的实际数据集中使用,该数据集也是浮点数。
print(df_to_multidx_df(test_df))
# array([ nan,nan,0.044,0.19,# nan,nan])
# Values
# Previous Columns Previous Index
# col1 row1 NaN
# row2 NaN
# row3 0.044
# row4 NaN
# col2 row1 0.190
# row2 NaN
# row3 NaN
# row4 NaN
# col3 row1 NaN
# row2 NaN
# row3 NaN
# row4 NaN
print(test_df)
# col1 col2 col3
# row1 1.0 2.0 3.0
# row2 2.0 3.0 4.0
# row3 3.0 4.0 5.0
# row4 4.0 5.0 6.0
print(df_to_multidx_df(test_df))
# array([0.0e+000,4.9e-324,9.9e-324,1.5e-323,2.0e-323,2.5e-323,# 3.0e-323,3.5e-323,4.0e-323,4.4e-323,4.9e-323,5.4e-323])
# Values
# Previous Columns Previous Index
# col1 row1 0.000000e+00
# row2 4.940656e-324
# row3 9.881313e-324
# row4 1.482197e-323
# col2 row1 1.976263e-323
# row2 2.470328e-323
# row3 2.964394e-323
# row4 3.458460e-323
# col3 row1 3.952525e-323
# row2 4.446591e-323
# row3 4.940656e-323
# row4 5.434722e-323
同样,使用Python列表进行切换也产生了奇怪的结果。注释掉数组实现并取消对列表实现的注释,您将在测试数据帧上获得以下内容,一遍又一遍地运行该语句:
print(df_to_multidx_df(test_df))
# Values
# Previous Columns Previous Index
# col1 row1 1.0
# row2 2.0
# row3 3.0
# row4 4.0
# col2 row1 2.0
# row2 3.0
# row3 4.0
# row4 5.0
# col3 row1 3.0
# row2 4.0
# row3 5.0
# row4 6.0
print(test_df)
# col1 col2 col3
# row1 1.0 2.0 3.0
# row2 2.0 3.0 4.0
# row3 3.0 4.0 5.0
# row4 4.0 5.0 6.0
但是,我的真实数据框已被修改:
print(df_dict['gvtx_eiu'])
# 2006 2007 2008 2009 2010 2011 2012 2013 2014 \
# country
# Afghanistan 0.000 0.0395 0.079 0.079 0.079 0.079 0.079 0.079 0.114
# Albania 0.507 0.5070 0.507 0.507 0.507 0.471 0.400 0.400 0.400
# Algeria 0.221 0.2210 0.221 0.221 0.221 0.221 0.221 0.221 0.221
# Angola 0.214 0.2680 0.321 0.321 0.321 0.321 0.321 0.321 0.321
# Argentina 0.500 0.5000 0.500 0.535 0.571 0.571 0.571 0.571 0.571
# ... ... ... ... ... ... ... ... ... ...
# Venezuela 0.364 0.3960 0.429 0.411 0.393 0.393 0.429 0.429 0.429
# Vietnam 0.429 0.4290 0.429 0.429 0.429 0.429 0.393 0.393 0.393
# Yemen 0.271 0.2610 0.250 0.214 0.179 0.036 0.143 0.143 0.143
# Zambia 0.464 0.4640 0.464 0.500 0.536 0.500 0.536 0.536 0.536
# Zimbabwe 0.079 0.0790 0.079 0.104 0.129 0.129 0.129 0.129 0.129
# 2015 2016 2017 2018
# country
# Afghanistan 0.114 0.114 0.114 0.114
# Albania 0.436 0.436 0.471 0.471
# Algeria 0.221 0.221 0.221 0.221
# Angola 0.321 0.321 0.286 0.286
# Argentina 0.500 0.500 0.500 0.536
# ... ... ... ... ...
# Venezuela 0.393 0.250 0.286 0.179
# Vietnam 0.393 0.321 0.321 0.321
# Yemen 0.036 0.000 0.000 0.000
# Zambia 0.536 0.536 0.500 0.464
# Zimbabwe 0.200 0.200 0.200 0.200
# [164 rows x 13 columns]
test_serialized = df_to_multidx_df(df=df_dict['gvtx_eiu'],cols_idx1_name='Year',idx_idx2_name='Country',val_col_name='gvtx_eiu')
print(test_serialized)
# gvtx_eiu
# Year Country
# 2006 Afghanistan 0.000
# Albania 0.507
# Algeria 0.221
# Angola 0.214
# Argentina 0.500
# ... ...
# 2018 Venezuela 0.179
# Vietnam 0.321
# Yemen 0.000
# Zambia 0.464
# Zimbabwe 0.200
# [2132 rows x 1 columns]
print(df_dict['gvtx_eiu'])
# gvtx_eiu
# Year Country
# 2006 Afghanistan 0.000
# Albania 0.507
# Algeria 0.221
# Angola 0.214
# Argentina 0.500
# ... ...
# 2018 Venezuela 0.179
# Vietnam 0.321
# Yemen 0.000
# Zambia 0.464
# Zimbabwe 0.200
# [2132 rows x 1 columns]
(再次尝试会产生错误,因为输入数据帧不再是正确的结构。)
我能分辨出测试数据帧和真实数据帧之间的唯一区别是,真实数据帧是从数据帧的字典中提取的。我不知道为什么会有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。