pandas 用python从两个list创建table到dataframe

jecbmhm3  于 2023-09-29  发布在  Python
关注(0)|答案(3)|浏览(160)

我是python新手,我想从下面的两个列表中创建一个dataframe。

my_foldername = ['folder1','folder2']
my_filetype = ['avi.txt','bmp.txt','exe.txt','avi.txt','bmp.txt','exe.txt']

下面是我当前代码行。

df = pd.DataFrame(list(zip(my_hostname,my_fileType)))

我想要这样的产品。

| -------- | -------- | -------- | -------- |
|FolderName|   AVI    |    BMP   |    EXE   |
| -------- | -------- | -------- | -------- |
| folder1  | avi.txt  | bmp.txt  | exe.txt  |
| -------- | -------- | -------- | -------- |
| folder2  | avi.txt  | bmp.txt  | exe.txt  |
| -------- | -------- | -------- | -------- |
xuo3flqw

xuo3flqw1#

您可以像以前那样使用zip,但首先需要将第二个列表分成块。在python 3.12+中,这可以通过itertools.batched轻松完成:

from itertools import batched

n = len(my_filetype)//len(my_foldername)

out = pd.DataFrame([[f, *t] for f,t
                    in zip(my_foldername, batched(my_filetype, n))],
                   columns=['FolderName', 'AVI', 'BMP', 'EXE'])

输出量:

FolderName      AVI      BMP      EXE
0    folder1  avi.txt  bmp.txt  exe.txt
1    folder2  avi.txt  bmp.txt  exe.txt00

如果你没有最新的python版本(<3.12),请使用batched方法:

from itertools import islice

def batched(iterable, n):
    # batched('ABCDEFG', 3) --> ABC DEF G
    if n < 1:
        raise ValueError('n must be at least one')
    it = iter(iterable)
    while batch := tuple(islice(it, n)):
        yield batch

或者,使用一个简单的循环和enumerate

n = len(my_filetype)//len(my_foldername)

out = pd.DataFrame([[f, *my_filetype[i*n:(i+1)*n]] for i,f
                    in enumerate(my_foldername)],
                   columns=['FolderName', 'AVI', 'BMP', 'EXE'])
niwlg2el

niwlg2el2#

可以使用numpy.reshapemy_filetype更改为2 x 3数组:

df = pd.DataFrame(
    np.reshape(my_filetype, (2, 3)),
    columns=["AVI", "BMP", "EXE"],
    index=pd.Series(my_foldername, name="FolderName"),
).reset_index()

如果my_filetype有更多的元素,并且你不想手动计算行数,你可以提供-1来告诉numpy为你做这件事:

np.reshape(my_filetype, (-1, 3))
hgb9j2n6

hgb9j2n63#

您可以先创建一个字典,然后使用Pandas库将其转换为DataFrame,如下所示:

import pandas as pd

my_foldername = ['folder1', 'folder2']
my_filetype = ['avi.txt', 'bmp.txt', 'exe.txt', 'avi.txt', 'bmp.txt', 'exe.txt']

data = {}

for file_type in my_filetype:
    file_extension = file_type.split('.')[0].upper()
    data[file_extension] = data.get(file_extension, []) + [file_type]

df = pd.DataFrame(data)
df.insert(0, 'FolderName', my_foldername)
df = df.fillna('')

print(df)

这是上面代码的输出:

相关问题