如何根据熊猫中的条件替换列之间的值?

时间:2020-06-29 11:06:11

标签: python-3.x pandas

我的数据框的格式为

ID              Effective_Date        Paid_Off_Time

xqd27070601     09 August 2016        10 July 2016
xqd21601070     09 September 2016     10 July 2016
xqd26010760     10 July 2016          09 November 2016

编辑 最初,显示的日期为String类型。它们的格式可以是:像9/18/2016 16:5609 August 2016,2016年9月18日。我们应该考虑转换为时间戳以便于比较吗?

我想要的 如果Effective_Date> Paid_Off_Time , replace value of Effective_Date with Paid_Off_Time and the value of Paid_Off_Time with Effective_Date`''。 基本上,因为日期插入在错误的列中,所以请在2列之间切换值。

我曾经考虑过使用np.where,但是我想知道,难道没有那么冗长,更简洁的解决方案吗?

#create a new dataFrame
testDf = pd.DataFrame(columns=['Effective_Date','Paid_Off_Time'])

#check if Effective_Date < myDataFrame
testDf['Effective_Date'] = np.where(myDataFrame.Effective_Date < myDataFrame.Paid_Off_Time,myDataFrame.Effective_Date,myDataFrame.Paid_Off_Time)

#check if Paid_Off_Time < Effective_Date
testDf['Paid_Off_Time'] = np.where(myDataFrame.Paid_Off_Time < myDataFrame.Effective_Date,myDataFrame.Effective_Date,myDataFrame.Paid_Off_Time)

myDataFrame['Effective_Date'] = testDf[testDf['Effective_Date']]
myDataFrame['Paid_Off_Time'] = testDf[testDf['Paid_Off_Time']]

3 个答案:

答案 0 :(得分:1)

Convert dates to datetime

df=df.assign(Effective_Date=pd.to_datetime(df['Effective_Date'], format='%d %B %Y'),Paid_Off_Time=pd.to_datetime(df['Paid_Off_Time'], format='%d %B %Y'))

根据条件选择

m=df.Effective_Date>df.Paid_Off_Time

如果满足条件则交换值

 df.loc[m, ['Effective_Date','Paid_Off_Time']]=df.loc[m, ['Paid_Off_Time','Effective_Date']].values#Swap rows if condition met
    print(df)



  ID     Effective_Date Paid_Off_Time
0  xqd27070601     09 August 2016  10 July 2016
1  xqd21601070  09 September 2016  10 July 2016
2  xqd26010760   09 November 2016  10 July 2016

答案 1 :(得分:0)

您可以尝试对numpy中的值进行排序以提高性能:

df['Effective_Date'] = pd.to_datetime(df['Effective_Date'])
df['Paid_Off_Time'] = pd.to_datetime(df['Paid_Off_Time'])

c = ['Effective_Date','Paid_Off_Time']
data = np.sort(myDataFrame[c].to_numpy(), axis=1)
myDataFrame[c] = pd.DataFrame(data, columns=c)
print (myDataFrame)
            ID Effective_Date Paid_Off_Time
0  xqd27070601     2016-07-10    2016-08-09
1  xqd21601070     2016-07-10    2016-09-09
2  xqd26010760     2016-07-10    2016-11-09

答案 2 :(得分:0)

我正在共享一部分我的项目代码,其中做了一些类似的事情,希望这种实现能够为您提供解决方案。

{{1}}