遍历字典,并使用迭代将它们附加到数据框

时间:2020-09-17 08:34:22

标签: python pandas dataframe

我对Python和Pandas还是很陌生。我需要一些正在使用的代码的帮助。

我有一本名为df的字典,其中包含一些文件及其txt格式的内容。该词典的关键字是文件名(date.txt),值是其内容。看起来是这样的:

{'02_01_2020':                                                    0 
0  1  229017              Cust_1         CUR  ...
1  2  629324              Cust_2         CUR  ...
2  3  863300              Cust_3         CUR  ...
3  4  670338              Cust_4         CUR  ...
4  5  987039              Cust_5         CUR  ...
5  6  485912              Cust_6         CUR  ...,'03_01_2020':         0                                                  
0  1  122403              Cust_1         CUR  ...
1  2  779269              Cust_2         CUR  ...
2  3  728965              Cust_3         CUR  ...
3  4  527716              Cust_4         CUR  ...
4  5  796179              Cust_5         CUR  ...
5  6  027872              Cust_6         CUR  ...
6  7  449767              Cust_7         CUR  ...
7  8  598752              Cust_8         CUR  ...
8  9  180422              Cust_9         CUR  ..., .... goes until the last file ('31_01_2020')}

如上所述,每个文件包含不同的数据。文件02_01_2020.txt有6个条目,文件03_01_2020.txt有9个条目,依此类推,直到最后一个文件(31_01_2020.txt)。

我在这里的目标是将必要的信息分为自己的列(客户名称,货币等),并将文件名插入一个单独的列,该列称为paid_date。我用iterrows()遍历了这个字典文件。这是代码:

def data_process(df):

    #dataframe that i created outside this function
    global df_data_1

    for key,value in df.items():
        df1 = pd.DataFrame(value)
        df1['Paid_date'] = key.replace('_', '/')
        #df1.insert(1, 'Paid_date', key.replace('_','/')) - another attempt to insert the col
        
        for index,row in df1.iterrows(): 
            df_Item_Num = row.str.slice(start = 0, stop=2) # entry number
            df_DUMP_1 = row.str.slice(start = 0, stop=23) # not used
            df_NAME = row.str.slice(start = 23, stop=40) 
            df_CURRENCY = row.str.slice(start = 40, stop=54) 
            df_AMOUNT = row.str.slice(start = 54, stop=66)  
            df_DATE = row.str.slice(start = 68, stop=86) 
            df_DUMP_2 = row.str.slice(start = 87, stop=-1) # not used   
            df_ALL_ITEMS = pd.concat([df_Item_Num, df_NAME, df_CURRENCY, df_AMOUNT, df_DATE], ignore_index=True)
            df_data_1 = df_data_1.append(df_ALL_ITEMS, ignore_index=True)
                                
    return df_data_1

当我禁用传递键的df1['Paid_date'] = key.replace('_', '/')列创建代码时,结果如下所示:

      0                  1               2             3                   4
0    1   Cust_1           CUR              Amount  Date_Time
1    2   Cust_2           CUR              Amount  Date_Time
2    3   Cust_3           CUR              Amount  Date_Time
3    4   Cust_4           CUR              Amount  Date_Time
4    5   Cust_5           CUR              Amount  Date_Time
..   ..                ...             ...           ...                 ...
185  10   Cust_6          CUR              Amount   Date_Time
186  11   Cust_7          CUR              Amount   Date_Time
187  12   Cust_8          CUR              Amount   Date_Time
188  13   Cust_9          CUR              Amount   Date_Time
189  14   Cust_10         CUR              Amount   Date_Time

这正是我所需要的,仅不包括paid_date列(我需要将文件名存储在对应于该特定文件的每一行中。例如02_01_2020将被打印6次至6行,03_01_2020至9行等)。但是,当我启用列创建代码时,它最终像这样:

      0   1                  2 3   ...             6 7                    8 9 
0    1   02  Cust_1                ...    Amount            Date_Time   
1    2   02  Cust_2                ...    Amount            Date_Time   
2    3   02  Cust_3                ...    Amount            Date_Time   
3    4   02  Cust_4                ...    Amount            Date_Time   
4    5   02  Cust_5                ...    Amount            Date_Time   
..   ..  ..                ... ..  ...           ... ..                 ... ..
185  10  31   Cust_6               ...    Amount            Date_Time   
186  11  31   Cust_7               ...    Amount            Date_Time   
187  12  31   Cust_8               ...    Amount            Date_Time   
188  13  31   Cust_9               ...    Amount            Date_Time   
189  14  31   Cust_10              ...    Amount            Date_Time   

我有几个新的空列,显然键(文件名)没有完全插入(仅以某种方式将日期存储在新列中,不包括月份和年份)。解决此问题的最有效方法是什么?任何帮助将不胜感激。谢谢

编辑1

我正在使用的每个txt文件的条目如下所示:

1              CUST_NAME_1         CURRENCY            AMOUNT  DATE_TIME  
2              CUST_NAME_2         CURRENCY            AMOUNT  DATE_TIME
3              CUST_NAME_3         CURRENCY            AMOUNT  DATE_TIME
4              CUST_NAME_4         CURRENCY            AMOUNT  DATE_TIME
5              CUST_NAME_5         CURRENCY            AMOUNT  DATE_TIME  

在txt文件中,有很多空格将信息分隔开,如上所示。我的代码首先要做的是遍历计算机中存储所有文件的目录,并将它们附加到两个列表中。这是代码:

#SET UP EMPTY LISTS & Dictionary
filelist = []
filename = []
df = {}

def file_process(mydir):
    for path, dirs, files in os.walk(mydir):
        for file in files:
            if file.endswith('.txt'):
                filelist.append(file)
                filename.append(file[0:10])
    return filelist, filename

上面的代码返回两个列表。

  1. 文件列表包含每个txt文件(02_01_2020.txt,03_01_2020.txt等)
  2. 文件名仅包含每个文件的名称(02_01_2020、03_01_2020等)

然后,我编写了以下代码,将这两个列表转换为单个字典(感谢您的建议,避免使用df作为字典名称)。

def dict_process(filelist, filename):
    for key in filename:
        for value in filelist:
            df[key] = pd.read_csv(value, sep="delimiter", skiprows = [0,1,2,3,4,5,6,7,8], skipfooter=6, header=None)
            filelist.remove(value)
            break
    return df

上面的代码返回我先前编写的字典,其中文件名设置为键,所有文件内容为其值。

我在for index,row in df1.iterrows():中所做的(或认为我做了)是对iterrows()返回的每个序列进行切片,并仅保留我想要的信息并将它们连接到一个空的数据框中。这样有效吗?还是有另一种方法?

0 个答案:

没有答案