데이터 프레임으로 목록 추가하기

수집과 이해를 초월하다


며칠 전에 나는 한 편의 댓글을 써서 수집과 이해의 사용량을 총결하였다.데이터는 lists(dictionaries 또는 tuples 목록)의 형식으로 제공된다.저자는 데이터에 대한 질문에 대답하기 위해 list comprehensions을 자주 사용한다. for로 목록을 순환한다.나는 이것이 매우 파이톤을 중심으로 문제를 해결하는 방법이라고 생각하기 시작했다.
모든 데이터가 표 데이터는 아니지만, 우리는 더 많은 상황에서 표 데이터와 유사한 표 데이터를 처리할 것이라고 가정할 이유가 있다. (주의: 나는 이곳의 다른 관점에 대해 개방적인 태도를 가지고 있으니, 언제든지 아래에서 평론을 발표하십시오.)
어떤 상황에서도 나는 이치에게 물어볼 것이다.

How would I approach the same problem using data frames?


이것이 바로 본문의 주제다.
너는 상하문에서 그것들을 인용할 수 있다.그리고 이것은 Joel Grus의 책과 약간 다르다는 것을 기억해 주십시오. (예를 들어 저는 여기에서 pandas을 사용하고, 여기서 jupyter notebook을 사용하며, 이 두 판본은 모두 이 책에 소개되지 않았습니다.)
다음은 귀하가 데이터 과학자로서 새로 초빙한 데이터로 참고할 수 있는 자료입니다.™

# users in the network
# stored as a list of dictionaries
users = [
    {"id": 0, "name": "Hero"},
    {"id": 1, "name": "Dunn"},
    {"id": 2, "name": "Sue"},
    {"id": 3, "name": "Chi"},
    {"id": 4, "name": "Thor"},
    {"id": 5, "name": "Clive"},
    {"id": 6, "name": "Hicks"},
    {"id": 7, "name": "Devin"},
    {"id": 8, "name": "Kate"},
    {"id": 9, "name": "Klein"}
]

# friendship pairings in the network
# stored as a list of tuples
friendship_pairs = [(0,1), (0,2), (1,2), (1,3), (2,3), (3,4),
                    (4,5), (5,6), (5,7), (6,8), (7,8), (8,9)]

# interests data
# stored as another list of tuples
interests = [
    (0, "Hadoop"), (0, "Big Data"), (0, "HBase"), (0, "Java"),
    (0, "Spark"), (0, "Storm"), (0, "Cassandra"),
    (1, "NoSQL"), (1, "MongoDB"), (1, "Cassandra"), (1, "HBase"),
    (1, "Postgres"), (2, "Python"), (2, "scikit-learn"), (2, "scipy"),
    (2, "numpy"), (2, "statsmodels"), (2, "pandas"), (3, "R"), (3, "Python"),
    (3, "statistics"), (3, "regression"), (3, "probability"),
    (4, "machine learning"), (4, "regression"), (4, "decision trees"),
    (4, "libsvm"), (5, "Python"), (5, "R"), (5, "Java"), (5, "C++"),
    (5, "Haskell"), (5, "programming langauges"), (6, "statistics"),
    (6, "probability"), (6, "mathematics"), (6, "theory"),
    (7, "machine learning"), (7, "scikit-learn"), (7, "Mahout"),
    (7, "neural networks"), (8, "neural networks"), (8, "deep learning"),
    (8, "Big Data"), (8, "artificial intelligence"), (9, "Hadoop"),
    (9, "Java"), (9, "MapReduce"), (9, "Big Data")
    ]
이러한 데이터를 감안하여 우리는 함수를 만들고 for 순환과 목록 이해를 사용하여 다음과 같은 문제에 대답할 수 있다.
  • 사용자 한 명당 친구는 누구입니까?
  • 접속의 총 및 평균 수는 얼마입니까?
  • 의 관심 분야는 무엇입니까?
  • 이 인터넷에서 가장 유행하는 주제는 무엇입니까?
  • 그러나 이 장은 목록, 함수와 이해로 끝난다.데이터 프레임에 데이터를 저장하는 것은 어떻습니까?
    먼저 users을 데이터 프레임으로 저장했습니다.
    import pandas as pd
    
    # convert list of dict into dataframe
    users_df = pd.DataFrame(users)
    users_df
    
    시각적으로만 보면 data framelist of dictionaries과 달라 보입니다.

    당신의 이정수는 다를 수 있지만, 목록과 데이터 상자를 볼 때, 나는 데이터에 대한 이해가 매우 다르다.행과 열은 데이터에 대한 나의 견해에 뿌리가 깊다.
    그 다음에 우리는 우의를 대표하는 list of tuples을 얻었다. 우리는 dictionary을 사용하여 이를 dictionary comprehension으로 전환했다.
    # list of tuples
    friendship_pairs = [(0,1), (0,2), (1,2), (1,3), (2,3), (3,4),
                        (4,5), (5,6), (5,7), (6,8), (7,8), (8,9)]
    
    # create a dict, where keys are users id, 
    # dictionary comprehension
    friendships = {user["id"]: [] for user in users}
    
    for i, j in friendship_pairs:
        friendships[i].append(j)
        friendships[j].append(i)
    
    앞의 예와 유사하게 데이터를 data frame으로 보는 것과 dictionary으로 보는 것이 다르다는 것을 알 수 있습니다.

    이 점에서부터 저는 pandas에서 몇 가지 조작을 해서 앞의 두 표를 연결했습니다. 이렇게 해서 저는 사용자 id, 사용자 이름과 그들의 첫 번째, 두 번째 또는 세 번째 친구의 id를 포함했습니다. (어떤 경우 이 네트워크에 있는 사람은 최대 세 개의 직접 연결이 있습니다).
    구체적인 pandas 동작을 알고 싶으면 다음은 코드입니다.
    # The users_df is fine as is with two columns: id and name (see above)
    
    # We'll transform the friendships_df
    
    # reset_index allows us to add an index column
    friendships_df.reset_index(inplace=True)
    # add index column
    friendships_df = friendships_df.rename(columns = {"id":"new column name"})
    # change index column to 'id'
    friendships_df = friendships_df.rename(columns = {'index':'id'})
    # join with users_df so we get each person's name
    users_friendships = pd.merge(users_df, friendships_df, on='id')
    
    users_dffriendships_df에 가입하면 다음과 같습니다.

    우리는 usersfriendships의 데이터를 가지고 있기 때문에, 우리는 함수를 만들어서 우리가 '사용자마다 몇 명의 친구가 있습니까?' 라고 대답하는 것을 도울 수 있다.또한 list comprehension을 생성하여 user에서 각 users을 순환해야 합니다.
    # function to count how many friend each user has
    def number_of_friends(user):
        """How many friends does _user_ have?"""
        user_id = user["id"]
        friend_ids = friendships[user_id]
        return len(friend_ids)
    
    # list comprehension to apply the function for each user
    num_friends_by_id = [(user["id"], number_of_friends(user)) for user in users]
    
    # this gives us a list of tuples
    num_friends_by_id
    
    [(0, 2),
     (1, 3),
     (2, 3),
     (3, 3),
     (4, 2),
     (5, 3),
     (6, 2),
     (7, 2),
     (8, 3),
     (9, 1)]
    
    
    마찬가지로 데이터는 list of tuplesdata frame이 다르므로 계속해서 판다 데이터 프레임으로 변환해 보겠습니다.
    # when converting to data frame, we can set the name of the columns to id and num_friends; this sets us up for another join
    num_friends_by_id = pd.DataFrame(num_friends_by_id, columns = ['id', 'num_friends'])
    
    "id"열이 있기 때문에 이전에 만든 users_friendships 데이터 프레임과 연결할 수 있습니다.
    users_friendships 함수를 merge에 연결하면 다음과 같은 효과를 얻을 수 있습니다(users_friendships2).

    지금 너는 이미 이 과정에 익숙해졌다.우리는 보통 list 또는 dictionaries 중의 tuples을 집합하여 data frame으로 바꾸기를 희망한다.
    우리는 interests 변수에 대해 이 과정을 반복할 것이다. 이것은 긴 list of tuples이다. (위의 글 참조)우리는 데이터 프레임으로 변환한 다음에 users_friendships_2을 추가하여 더 긴 데이터 프레임을 얻을 것이다. 그 중에서 interests은 한 열(주의: 그림은 빈칸으로 잘라진다):

    pandas의 장점은 모든 데이터를 하나의 데이터 상자에 연결하면 데이터를 조회할 수 있다는 것이다.
    예를 들어 모든 사용자가'빅데이터'에 관심이 있는 것을 보고 싶을 수도 있습니다.

    그 전에 list comprehension을 반환하는 함수를 만들어야 합니다.
    def data_scientists_who_like(target_interest):
        """Find the ids of all users who like the target interests."""
        return [user_id
                for user_id, user_interest in interests
                if user_interest == target_interest]
    
    data_scientists_who_like("Big Data")
    
    데이터 상자의 또 다른 장점은 여러 조건에서 열을 조회할 수 있다는 점이다. 다음은 두 가지 방법으로 여러 주제를 조회할 수 있다.
    
    # Option One: Use .query()
    user_friendship_topics.query('topic == "machine learning" | topic == "regression" | topic == "decision trees" | topic == "libsvm"')
    
    # Option Two: Use .isin()
    user_friendship_topics[user_friendship_topics['topic'].isin(["machine learning", "regression", "decision trees", "libsvm"])]
    
    
    두 옵션 모두 이 데이터 프레임을 반환합니다.

    데이터 프레임 조회를 통해 알 수 있는 것은 다음과 같습니다.
  • 네 가지 주제에 관심 있는 모든 사용자
  • Thor
  • 과 관심 있는 사용자
  • (필요한 경우) 사용자당
  • num_friends이 네트워크에서 가장 인기 있는 주제를 찾을 수도 있습니다.
    # groupby topic, tally(count), then reset_index(), then sort
    user_friendship_topics.groupby(['topic']).count().reset_index().sort_values('id', ascending=False)
    
    groupby 두 열(이름과 주제)을 사용하여 각 사용자가 나열한 관심 주제를 볼 수도 있습니다.
    user_friendship_topics.groupby(['name', 'topic']).count()
    

    데이터 프레임이 파이톤에서 더 익숙한 조작(예를 들어 순환과/또는 목록 이해)의 강력한 보충이라고 확신하시기 바랍니다.이 두 가지 방법은 모두 각종 형식으로 데이터를 조작하기 위해 깊이 이해할 만한 가치가 있다.(예를 들어 JSON 데이터에 접근하기 위해 파이썬 사전은 데이터 프레임에 ideal이다).

    좋은 웹페이지 즐겨찾기