如何计算多个数据帧的行和列?

问题描述

我有3个数据帧:

d1 = {'col1': [1,2],'col2': [3,4]}
d2 = {'col1': [1,2,3],4,5]}
d3 = {'col1': [1,3,5],5,6,7]}
df1 = pd.DataFrame(data=d1)
df2 = pd.DataFrame(data=d2)
df3 = pd.DataFrame(data=d3)

现在,我正在尝试计算这3个数据帧的行数和列数,并将其放置在名为my_dataframe的新数据帧中。这是我使用的代码:

dataframes = [df1,df2,df3]
number_rows = [df.shape[0] for df in dataframes]
number_columns = [df.shape[1] for df in dataframes]

my_data = {'df': dataframes,'rows': number_rows,'columns': number_columns}

my_dataframe = pd.DataFrame(my_data)

print(my_dataframe)

这是我的输出:

enter image description here

这是我的预期输出:

    df   -   rows   -   columns      
0   df1  -   2      -   2
1   df2  -   3      -   2
2   df3  -   5      -   2

有人可以向我解释出了什么问题以及如何解决此问题?谢谢大家。

解决方法

在定义要插入my_data的数据的行中,您无意中插入了原始数据框本身而不是其名称。

my_data = {'df': dataframes,'rows': number_rows,'columns': number_columns}

相反,定义df_names = ['df1','df2','df3']并将其用作my_datadataframes的值。

我认为Pandas中没有一种很好的内置方法来获取数据框的名称。 (不过,我可能错了。)

,

更好的是使用字典:

dataframes = {'df1': df1,'df2':df2,'df3':df3}

number_rows = [df.shape[0] for k,df in dataframes.items()]
number_columns = [df.shape[1] for k,df in dataframes.items()]
names = list(dataframes.keys())


my_data = {'df': names,'columns': number_columns}

my_dataframe = pd.DataFrame(my_data)

print(my_dataframe)
    df  rows  columns
0  df1     2        2
1  df2     3        2
2  df3     5        2

或者:

dataframes = {'df1': df1,'df3':df3}

my_dataframe = pd.DataFrame([(k,df.shape[0],df.shape[1]) for k,df in dataframes.items()],columns=['df','rows','columns'])

print(my_dataframe)
    df  rows  columns
0  df1     2        2
1  df2     3        2
2  df3     5        2

可能的,但是需要inspect lib:

dataframes = [df1,df2,df3]

import inspect

#https://stackoverflow.com/a/40536047
def retrieve_name(var):
        """
        Gets the name of var. Does it from the out most frame inner-wards.
        :param var: variable to get name from.
        :return: string
        """
        for fi in reversed(inspect.stack()):
            names = [var_name for var_name,var_val in fi.frame.f_locals.items() if var_val is var]
            if len(names) > 0:
                return names[0]

number_rows = [df.shape[0] for df in dataframes]
number_columns = [df.shape[1] for df in dataframes]
names = [retrieve_name(x) for x in dataframes]

my_data = {'df': names,'columns': number_columns}

my_dataframe = pd.DataFrame(my_data)
print(my_dataframe)
    df  rows  columns
0  df1     2        2
1  df2     3        2
2  df3     5        2
,

您可以尝试:

d = pd.DataFrame([{'df': k,'rows': v.shape[0],'cols': v.shape[1]}
                  for k,v in zip(('df1','df2'),(df1,df3))])

print(d)

    df  rows  cols
0  df1     2     2
1  df2     3     2
2  df2     5     2

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...