簡體   English   中英

Pandas的新手,需要從其他2個人創建df(不是合並)

[英]New to Pandas, need to create a df from 2 others (not a merge)

我有一些屬性(a1,a2,a3,a4)的酒店列表:

hotel   date    a1        a2       a3       a4
H1      201501  business  couple   pool     no kid
H2      201501  NaN       couple   pool     NaN
H3      201502  NaN       couple   beach    kids

我還列出了鏈接到某些屬性的房間類型。

id   rooms    a1        a2     a3
AAA  single   business
BBB  double   couple
BBB  double   man       woman
CCC  triple   family
CCC  triple   couple    kid

每個選項(單,雙,三)都鏈接到屬性組合(a1,a2,a3,...)。例如,(夫婦)或(男人+女人)將帶來選項“ double”。 因此,酒店H1獲得單人和雙人房。

如何使用這些選項創建新的DataFrame? 每個酒店,例如:

hotel   date    single  double  triple
H1      201501  1       1       0
H2      201501  0       1       0
H3      201502  0       1       1

我使用簡單的data_model在簡單的python中輕松完成了所有這些操作,但是我以后想做一些統計,所以我嘗試使用pandas。

感謝您的幫助!

編輯

我添加了一個簡單的python(不含熊貓)示例

hotels = [{'hotel':'H1', 'date':201501, 'attributes': ['business', 'couple', 'pool', 'no_kid']},
          {'hotel':'H2', 'date':201501, 'attributes': ['NaN', 'couple', 'pool', 'NaN']},
          {'hotel':'H3', 'date':201502, 'attributes': ['NaN', 'couple', 'beach', 'kids']}]
rooms = {'single':[['business']],
         'double':[['couple'], ['man', 'woman']],
         'triple':[['family'], ['couple', 'kids']]}
for hotel in hotels:
    hotel['rooms']=[]
    att_set = set(hotel['attributes'])
    for room, combi in rooms.iteritems():
        for tags in combi:
            tags_set = set(tags)
            if tags_set.issubset(att_set):
                hotel['rooms'].append(room)
    del(hotel['attributes'])
print hotels

[{'date': 201501,
  'hotel': 'H1',
  'rooms': ['double', 'single']},
 {'date': 201501,
  'hotel': 'H2',
  'rooms': ['double']},
 {'date': 201502,
  'hotel': 'H3',
  'rooms': ['double', 'triple']}]

如果不合並列表,就無法回答您的問題,而且由於您沒有提供鏈接它們的外鍵,因此無法進行合並。 但是,使用groupby可以很容易地進行計數:

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO
from pandas import DataFrame

TESTDATA=StringIO("""hotel   date    a1        a2       a3       a4
H1      201501  business  couple   pool     no_kid
H2      201501  NaN       couple   pool     NaN
H3      201502  NaN       couple   beach    kids
""")

df = DataFrame.from_csv(TESTDATA, sep=r"[ ]+")

df.reset_index().groupby(['hotel','date','a3']).size().unstack('a3').fillna(0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM