问题描述
我有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)
这是我的输出:
这是我的预期输出:
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_data
中dataframes
的值。
我认为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