Python 在操作现有列时基于现有列的多个条件创建新列
我是来自R背景的Python/pandas新手。我很难理解如何根据现有列的多个条件操纵现有列以创建新列。有10种不同的条件需要满足,但为了简单起见,我将使用2种情况的场景 在R中:Python 在操作现有列时基于现有列的多个条件创建新列,python,pandas,dataframe,Python,Pandas,Dataframe,我是来自R背景的Python/pandas新手。我很难理解如何根据现有列的多个条件操纵现有列以创建新列。有10种不同的条件需要满足,但为了简单起见,我将使用2种情况的场景 在R中: 我知道我可能有一些术语或概念不正确,并表示歉意,但是我看到的关于创建一个具有多个条件的新列的答案似乎不是在操纵他们正在检查条件的现有列,而是简单地接受一个赋值。我只能想象有一种更有效的方法可以做到这一点,它不太“R-ey”,但我不知道从哪里开始。这不是一个完整的答案,只是说明了strftime是如何工作的:strft
我知道我可能有一些术语或概念不正确,并表示歉意,但是我看到的关于创建一个具有多个条件的新列的答案似乎不是在操纵他们正在检查条件的现有列,而是简单地接受一个赋值。我只能想象有一种更有效的方法可以做到这一点,它不太“R-ey”,但我不知道从哪里开始。这不是一个完整的答案,只是说明了
strftime
是如何工作的:strftime
是一个date(time)
对象的方法,该对象以格式字符串为参数:
import pandas as pd
import datetime as dt
df = {'Date': ['2020-07-01', '2020-07-15']}
df = pd.DataFrame(df)
df['Date'] = pd.to_datetime(df['Date'], yearfirst = True, format = "%Y-%m-%d")
s = [dt.date(df['Date'][i].year, df['Date'][i].month + 1, 1).strftime('%Y-%m-%d')
for i in df['Date'].index]
print(s)
结果:
['2020-08-01', '2020-08-01']
Date Fiscal
0 2020-07-01 2020-07-01
1 2020-07-15 2020-08-01
再次:没有完整的答案,只是一个提示
编辑:您可以对此进行矢量化,例如:
import pandas as pd
import datetime as dt
df = {'Date': ['2020-07-01', '2020-07-15']}
df = pd.DataFrame(df)
df['Date'] = pd.to_datetime(df['Date'], yearfirst=True, format='%Y-%m-%d')
df['Fiscal'] = df['Date'].apply(lambda d: dt.date(d.year, d.month, 1)
if d.day < 15 else
dt.date(d.year, d.month + 1, 1))
print(df)
这里我使用了一个动态的lambda
函数。您还可以使用外部定义的函数:
def to_fiscal(date):
if date.day < 15:
return dt.date(date.year, date.month, 1)
return dt.date(date.year, date.month + 1, 1)
df['Fiscal'] = df['Date'].apply(to_fiscal)
def to_财政(日期):
如果date.day<15:
返回日期(日期.年,日期.月,1)
返回日期(日期.年,日期.月+1,1)
df['Fiscal']=df['Date']。适用于(财务)
一般来说,矢量化比在行上循环要好,因为循环是在一个更“低”的级别上完成的,而且效率更高。除非有人告诉我,否则我会这样做。如果有一种方法可以实现矢量化(或者只是一种更好的方法),我将不胜感激
import pandas as pd
import datetime as dt
df = {'Date': ['2020-07-01', '2020-07-15']}
df = pd.DataFrame(df)
df['Date'] = pd.to_datetime(df['Date'], yearfirst=True, format='%Y-%m-%d')
test_list = list()
for i in df['Date'].index:
mth = df['Date'][i].month
yr = df['Date'][i].year
dy = df['Date'][i].day
if(dy > 14):
new_date = dt.date(yr, mth + 1, 1)
else:
new_date = dt.date(yr, mth, 1)
test_list.append(new_date)
df['New_Date'] = test_list
我最初使用strftime是因为我认为它正在将日期转换为字符串,似乎我需要使用字符串来进行连接。但现在我甚至不确定是否需要它。为什么不在列中的每一行上循环,获取单个值,将其与compare语句一起使用,然后从中创建新值?这些“矢量化”函数有什么优势?到目前为止,这对我来说并不直观,就像R矢量化函数一样。我不明白这一点,但谢谢你的回答,我稍后会尝试理解的。我无意中编辑了你的帖子。我希望它不会被批准。很抱歉请参阅我的文章的编辑。
Date Fiscal
0 2020-07-01 2020-07-01
1 2020-07-15 2020-08-01
def to_fiscal(date):
if date.day < 15:
return dt.date(date.year, date.month, 1)
return dt.date(date.year, date.month + 1, 1)
df['Fiscal'] = df['Date'].apply(to_fiscal)
import pandas as pd
import datetime as dt
df = {'Date': ['2020-07-01', '2020-07-15']}
df = pd.DataFrame(df)
df['Date'] = pd.to_datetime(df['Date'], yearfirst=True, format='%Y-%m-%d')
test_list = list()
for i in df['Date'].index:
mth = df['Date'][i].month
yr = df['Date'][i].year
dy = df['Date'][i].day
if(dy > 14):
new_date = dt.date(yr, mth + 1, 1)
else:
new_date = dt.date(yr, mth, 1)
test_list.append(new_date)
df['New_Date'] = test_list