thắc mắc Xin tư vấn về DataFrames trong Pandas !!!!

  • Người tạo chủ đề Người tạo chủ đề ttdung46
  • Ngày bắt đầu Ngày bắt đầu

ttdung46

Junior Member
Xin chào các bác,

Nhờ các bác tư vấn giúp em vấn đề sau:
em có 1 DataFrame như này
import pandas as pd dict={'name':['a','b','c'], 'time1':[pd.Timestamp('2011-01-01'), pd.NaT, pd.Timestamp('2011-01-03')], 'time2':[pd.NaT, pd.Timestamp('2021-01-09'), pd.NaT]} df=pd.DataFrame(dict)
Hình ảnh kết quả của df như sau:
Screen Shot 2021-10-09 at 10.22.18.png

Em muốn tạo thêm 1 column mới 'time3' .Trong column 'time3' sẽ lấy giá trị của column 'time1' và 'time2' theo quy tắc như sau:
Xét từng row trong column 'time1'
  • Nếu giá trị tại column 'time1' không phải là NaT thì column 'time3' sẽ lấy giá trị đó
  • Nếu là NaT thì sẽ xét sang column 'time2' nếu thỏa mãn điều kiện không phải là NaT thì sẽ lấy giá trị này. Nếu không thì sẽ trả về NaT.

Nói có thể các bác vẫn chưa hiểu lắm, Em gửi cái hình minh họa cho kết quả em muốn làm để các bác dễ hiểu .

Screen Shot 2021-10-09 at 10.33.50.png

Nhờ các bác giúp em với.
 
Sửa lần cuối:
Mã:
import pandas as pd

data =  [[pd.Timestamp('2011-01-01'), pd.NaT, pd.Timestamp('2011-01-01')],
         [pd.NaT, pd.Timestamp('2011-01-01'), pd.NaT]]
# expected [Timestamp('2011-01-01 00:00:00'), Timestamp('2011-01-01 00:00:00'), Timestamp('2011-01-01 00:00:00')]

def coalesque(iterable, default):
    for x in iterable:
        if x is not pd.NaT: 
            return x
    return default

result = [ coalesque(n, '') for n in zip(*data)]  

print(result)

# Add column time3
df['time3'] = result
 
Mã:
import pandas as pd

data =  [[pd.Timestamp('2011-01-01'), pd.NaT, pd.Timestamp('2011-01-01')],
         [pd.NaT, pd.Timestamp('2011-01-01'), pd.NaT]]
# expected [Timestamp('2011-01-01 00:00:00'), Timestamp('2011-01-01 00:00:00'), Timestamp('2011-01-01 00:00:00')]

def coalesque(iterable, default):
    for x in iterable:
        if x is not pd.NaT:
            return x
    return default

result = [ coalesque(n, '') for n in zip(*data)]

print(result)

# Add column time3
df['time3'] = result
Thanks bác đã tư vấn, e thử và cho kết quả như em mong muốn.
Tuy nhiên do ví dụ nhỏ trên e đưa ra để minh họa cho vấn đề em gặp phải trong việc xử lý Data với khối lượng lớn. Nhờ bác giải đáp nốt giúp em những thắc mắc về giải pháp của bác đưa ra:
1. Với 1 Dataframe lớn thì data bác xử lý như nào ạ?
data = [[pd.Timestamp('2011-01-01'), pd.NaT, pd.Timestamp('2011-01-01')], [pd.NaT, pd.Timestamp('2011-01-01'), pd.NaT]]
2. Trong trường hợp thực tế DataFrame có sẵn các giá NaT thì phải xử lý thế nào trong for loop này ạ ( Sorry nếu câu hỏi hơi ngu, em mới học thôi ạ :( )
def coalesque(iterable, default): for x in iterable: if x is not pd.NaT: return x return default

Nhờ bác chỉ bảo cụ thể giúp em với.
 
Thanks bác đã tư vấn, e thử và cho kết quả như em mong muốn.
Tuy nhiên do ví dụ nhỏ trên e đưa ra để minh họa cho vấn đề em gặp phải trong việc xử lý Data với khối lượng lớn. Nhờ bác giải đáp nốt giúp em những thắc mắc về giải pháp của bác đưa ra:
1. Với 1 Dataframe lớn thì data bác xử lý như nào ạ?
data = [[pd.Timestamp('2011-01-01'), pd.NaT, pd.Timestamp('2011-01-01')], [pd.NaT, pd.Timestamp('2011-01-01'), pd.NaT]]
2. Trong trường hợp thực tế DataFrame có sẵn các giá NaT thì phải xử lý thế nào trong for loop này ạ ( Sorry nếu câu hỏi hơi ngu, em mới học thôi ạ :( )
def coalesque(iterable, default): for x in iterable: if x is not pd.NaT: return x return default

Nhờ bác chỉ bảo cụ thể giúp em với.
Nếu data lớn và các field đã có sẵn trong dataframe thì xài thg apply của thư viện.
Mã:
import pandas as pd

import pandas as pd
dict={'name':['a','b','c'],
     'time1':[pd.Timestamp('2011-01-01'),
            pd.NaT,
            pd.Timestamp('2011-01-03')],
      'time2':[pd.NaT,
            pd.Timestamp('2021-01-09'),
            pd.NaT]}
            
df=pd.DataFrame(dict)

def gen_time3(row):
    return row['time1'] if row['time1'] is not pd.NaT else row['time2'] # logic đơn giản như bạn diễn đạt

df['time3'] = df.apply(lambda row: gen_time3(row), axis=1)

print(df)
 
Nếu data lớn và các field đã có sẵn trong dataframe thì xài thg apply của thư viện.
Mã:
import pandas as pd

import pandas as pd
dict={'name':['a','b','c'],
     'time1':[pd.Timestamp('2011-01-01'),
            pd.NaT,
            pd.Timestamp('2011-01-03')],
      'time2':[pd.NaT,
            pd.Timestamp('2021-01-09'),
            pd.NaT]}
           
df=pd.DataFrame(dict)

def gen_time3(row):
    return row['time1'] if row['time1'] is not pd.NaT else row['time2'] # logic đơn giản như bạn diễn đạt

df['time3'] = df.apply(lambda row: gen_time3(row), axis=1)

print(df)
Cám ơn bác nhé. Đây đúng là giải pháp mà mình cần rồi :) :)
 

Thống kê chủ đề

Ngày tạo
ttdung46,
Người trả lời cuối
nguyenluc900,
Trả lời
6
Lượt xem
633
Quay lại
Lên đầu trang