python使用索引从组合数据帧中选择单个数据帧数据

时间:2019-07-27 21:48:31

标签: python dataframe

我有三个长度不同的数据框。我将它们合并到一个数据框中进行保存。现在,我想使用索引从组合数据框中检索单个数据框数据。我的问题的示例如下:

df1 = 
   data
0   10
1   20

df2 = 
   data
0   100
1   200
2   300

df3 = 
   data
0   1000
1   2000
2   3000
3   4000

combdf = pd.concat ([df1,df2,df3],ignore_index=True])

combdf = 
    data
0   10
1   20
2   100
3   200
4   300
5   1000
6   2000
7   3000
8   4000

我想从combdf检索单个数据帧的数据。我的代码:

data_len = [len(df1),len(df2),len(df3)]
for k in range(0,len(data_len),1):
    if k==0:
        st_id = 0
    else:
        st_id = sum(data_len[:k])
    ed_id = st_id+data_len[k]
    print(combdf.iloc[st_id:ed_id])

以上代码运行正常。有没有比不使用for循环更好的方法?

2 个答案:

答案 0 :(得分:1)

您可以先生成索引,然后再使用它们进行循环,而不是在循环时计算索引。

schedule[i][0]

答案 1 :(得分:0)

您可以使用pd.MultiIndex创建第二个索引列,其名称为原始DataFrame。您可以在下面看到如何执行此操作的示例:

import pandas as pd 

df_dict = {}

df_dict['df1'] = pd.DataFrame([10, 20])
df_dict['df2'] = pd.DataFrame([100, 200, 300])
df_dict['df3'] = pd.DataFrame([1000, 2000, 3000, 4000])

for df_name, df in df_dict.items():

    # Generate second level of index
    df_index_to_array = df.index.tolist()
    df_index_second_level = [df_name for i in range(0, df.shape[0])]

    df_idx_multi_index = pd.MultiIndex.from_arrays([
        df_index_to_array,
        df_index_second_level
    ])

    df_dict[df_name] = df.set_index(df_idx_multi_index)

df_list = [df for _, df in df_dict.items()]

comb_df = pd.concat(df_list)

这将导致:

          0
0 df1    10
1 df1    20
0 df2   100
1 df2   200
2 df2   300
0 df3  1000
1 df3  2000
2 df3  3000
3 df3  4000

要访问每个项目,您可以使用.loc中的pandas,例如:

>>> comb_df.loc[0, 'df2']
0 100
Name: (0, df2), dtype: int64