使用 pandas 数据框复制和重命名文件
Copy and rename files using a pandas dataframe
我是 python 的新用户,所以在下面遇到了困难。本质上,我试图将一堆文件从一个文件夹移动到另一个文件夹,并使用我构建的 pandas df - states_mapping_df 重命名它们。我尝试使用 states_mapping_df = states_mapping_df.astype("string")
将 df 转换为字符串,但这没有帮助。
from shutil import copyfile
covid_src_dir = r"I:\COVID\COVID tracker\UserA\Hospitalizations"
covid_new_dir = r"I:\COVID\COVID tracker\Hospitalizations_images"
states_mapping_df = pd.DataFrame ({"Abbr" :['CA','FL','IL','NJ','NY','NC','OH','PA','TX','VA'],
"State_Name" :['California','Florida','Illinois','New Jersey','New York','North Caroliina','Ohio','Pennsylvania','Texas','Virginia']})
for row in states_mapping_df['Abbr']:
#oldname = states_mapping_df['Abbr']+'.png'
#newname = states_mapping_df['State_Name']+'.png'
oldpath_covid = covid_src_dir + "\" + row +'.png'
newpath_covid = covid_new_dir + "\" + states_mapping_df['State_Name'].astype('string') +'.png'
copyfile(oldpath_covid, newpath_covid)
我 运行 它
时出现以下错误
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-260-40e52504bb33> in <module>
19 oldpath_covid = covid_src_dir + "\" + row +'.png'
20 newpath_covid = covid_new_dir + "\" + states_mapping_df['State_Name'].astype('string') +'.png'
---> 21 copyfile(oldpath_covid, newpath_covid)
22 #shutil.copy(oldpath_covid, newpath_covid)
~\Anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
238 sys.audit("shutil.copyfile", src, dst)
239
--> 240 if _samefile(src, dst):
241 raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
242
~\Anaconda3\lib\shutil.py in _samefile(src, dst)
215 if hasattr(os.path, 'samefile'):
216 try:
--> 217 return os.path.samefile(src, dst)
218 except OSError:
219 return False
~\Anaconda3\lib\genericpath.py in samefile(f1, f2)
99 """
100 s1 = os.stat(f1)
--> 101 s2 = os.stat(f2)
102 return samestat(s1, s2)
103
TypeError: stat: path should be string, bytes, os.PathLike or integer, not Series
我相信你的问题就在这里states_mapping_df['State_Name']
错误提示您正在使用系列。您正在尝试将文件重命名为 DataFrame 中的一整列值(系列)。
您需要过滤您想要的实际值。
试试这个。
for row in states_mapping_df['Abbr']:
#oldname = states_mapping_df['Abbr']+'.png'
#newname = states_mapping_df['State_Name']+'.png'
# filter row of df according to present row from abbr
filt = (df['Abbr']==row)
# use .loc to isolate the specific cell from the filter and the column name
row_filtered = df.loc[filt, 'State_Name']
# a list is returned where first value is the cell value
state_name = row_filtered.values[0]
oldpath_covid = covid_src_dir + "\" + row +'.png'
# renamed the initial series to the state name
newpath_covid = covid_new_dir + "\" +
state_name +'.png'
copyfile(oldpath_covid, newpath_covid)
编辑,更多信息:
.loc
是一种过滤 Pandas DataFrame 的方法。您使用两个参数 a,b
传递 df.loc[a,b]
,其中 a = 行,b = 列。
一般来说,大多数人会像我上面那样使用它,他们首先像我一样创建一个用于 a
的过滤器。
(df['state'] == 'California')
会 return 布尔值列表 (true/false),其中只有 California
的实例会 return True。然后,当您通过 .loc[]
将其与您的列名一起传递时,您将 return 特定单元格(或单元格,如果通过 b
的多个列名)。然后调用 .values
returns 所述值的数组。
另一种方法是 .iloc[]
,它的工作原理相同,但 i
表示 integer
。因此,如果你想 return 第 10 行和第 5 列到第 8 列,你将使用 df.iloc[10,5:8]
或者如果您想 return 您也可以做的所有事情 df.iloc[:,:]
或者如果您想 return 行值等于加利福尼亚的所有列,使用相同的过滤器表达式如上,那么你可以使用 df.loc[filt, ::]
冒号表达式代表索引切片,就像您在列表中所做的那样。
更多信息:
地点
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html
伊洛克
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
索引和切片
https://realpython.com/lessons/indexing-and-slicing/
各种其他过滤方法,包括上面提到的方法
https://towardsdatascience.com/7-different-ways-to-filter-pandas-dataframes-9e139888382a
我是 python 的新用户,所以在下面遇到了困难。本质上,我试图将一堆文件从一个文件夹移动到另一个文件夹,并使用我构建的 pandas df - states_mapping_df 重命名它们。我尝试使用 states_mapping_df = states_mapping_df.astype("string")
将 df 转换为字符串,但这没有帮助。
from shutil import copyfile
covid_src_dir = r"I:\COVID\COVID tracker\UserA\Hospitalizations"
covid_new_dir = r"I:\COVID\COVID tracker\Hospitalizations_images"
states_mapping_df = pd.DataFrame ({"Abbr" :['CA','FL','IL','NJ','NY','NC','OH','PA','TX','VA'],
"State_Name" :['California','Florida','Illinois','New Jersey','New York','North Caroliina','Ohio','Pennsylvania','Texas','Virginia']})
for row in states_mapping_df['Abbr']:
#oldname = states_mapping_df['Abbr']+'.png'
#newname = states_mapping_df['State_Name']+'.png'
oldpath_covid = covid_src_dir + "\" + row +'.png'
newpath_covid = covid_new_dir + "\" + states_mapping_df['State_Name'].astype('string') +'.png'
copyfile(oldpath_covid, newpath_covid)
我 运行 它
时出现以下错误---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-260-40e52504bb33> in <module>
19 oldpath_covid = covid_src_dir + "\" + row +'.png'
20 newpath_covid = covid_new_dir + "\" + states_mapping_df['State_Name'].astype('string') +'.png'
---> 21 copyfile(oldpath_covid, newpath_covid)
22 #shutil.copy(oldpath_covid, newpath_covid)
~\Anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
238 sys.audit("shutil.copyfile", src, dst)
239
--> 240 if _samefile(src, dst):
241 raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
242
~\Anaconda3\lib\shutil.py in _samefile(src, dst)
215 if hasattr(os.path, 'samefile'):
216 try:
--> 217 return os.path.samefile(src, dst)
218 except OSError:
219 return False
~\Anaconda3\lib\genericpath.py in samefile(f1, f2)
99 """
100 s1 = os.stat(f1)
--> 101 s2 = os.stat(f2)
102 return samestat(s1, s2)
103
TypeError: stat: path should be string, bytes, os.PathLike or integer, not Series
我相信你的问题就在这里states_mapping_df['State_Name']
错误提示您正在使用系列。您正在尝试将文件重命名为 DataFrame 中的一整列值(系列)。
您需要过滤您想要的实际值。
试试这个。
for row in states_mapping_df['Abbr']:
#oldname = states_mapping_df['Abbr']+'.png'
#newname = states_mapping_df['State_Name']+'.png'
# filter row of df according to present row from abbr
filt = (df['Abbr']==row)
# use .loc to isolate the specific cell from the filter and the column name
row_filtered = df.loc[filt, 'State_Name']
# a list is returned where first value is the cell value
state_name = row_filtered.values[0]
oldpath_covid = covid_src_dir + "\" + row +'.png'
# renamed the initial series to the state name
newpath_covid = covid_new_dir + "\" +
state_name +'.png'
copyfile(oldpath_covid, newpath_covid)
编辑,更多信息:
.loc
是一种过滤 Pandas DataFrame 的方法。您使用两个参数 a,b
传递 df.loc[a,b]
,其中 a = 行,b = 列。
一般来说,大多数人会像我上面那样使用它,他们首先像我一样创建一个用于 a
的过滤器。
(df['state'] == 'California')
会 return 布尔值列表 (true/false),其中只有 California
的实例会 return True。然后,当您通过 .loc[]
将其与您的列名一起传递时,您将 return 特定单元格(或单元格,如果通过 b
的多个列名)。然后调用 .values
returns 所述值的数组。
另一种方法是 .iloc[]
,它的工作原理相同,但 i
表示 integer
。因此,如果你想 return 第 10 行和第 5 列到第 8 列,你将使用 df.iloc[10,5:8]
或者如果您想 return 您也可以做的所有事情 df.iloc[:,:]
或者如果您想 return 行值等于加利福尼亚的所有列,使用相同的过滤器表达式如上,那么你可以使用 df.loc[filt, ::]
冒号表达式代表索引切片,就像您在列表中所做的那样。
更多信息:
地点 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html
伊洛克 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html
索引和切片 https://realpython.com/lessons/indexing-and-slicing/
各种其他过滤方法,包括上面提到的方法 https://towardsdatascience.com/7-different-ways-to-filter-pandas-dataframes-9e139888382a