如何使用apply和lambda

如何解决如何使用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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res