Computer >> Máy Tính >  >> Lập trình >> Python

Cách nối các hàng mới vào DataFrame bằng Mẫu trong Gấu trúc Python

Cách nối các hàng mới vào DataFrame bằng Mẫu trong Gấu trúc Python.

Giới thiệu

Là một chuyên gia kỹ thuật dữ liệu, tôi thường kết thúc việc tạo nhiều cột dẫn xuất hơn hàng vì vai trò tạo và gửi dữ liệu cho tôi để phân tích sẽ do các chuyên gia cơ sở dữ liệu khác đảm nhận. Tuy nhiên, nó không đúng trong mọi thời đại.

Chúng tôi phải tạo các hàng mẫu thay vì đợi nhóm chuyên gia dữ liệu gửi dữ liệu cho chúng tôi. Trong chủ đề này, tôi sẽ chỉ ra các thủ thuật đơn giản để tạo hàng.

Cách thực hiện ..

Trong công thức này, chúng ta sẽ bắt đầu bằng cách thêm các hàng vào một tập dữ liệu nhỏ với thuộc tính .loc và sau đó sẽ sử dụng phương thức .append.

1. Hãy để chúng tôi bắt đầu bằng cách tạo khung dữ liệu để thêm các hàng sau này.

Ví dụ

import pandas as pd
import numpy as np

players_info = pd.DataFrame(data=[
{"players": "Roger Federer", "titles": 20},
{"players": "Rafael Nadal", "titles": 20},
{"players": "Novak Djokovic", "titles": 17},
{"players": "Andy Murray", "titles": 3}], columns=["players", "titles"])

đầu ra

print(players_info.info())

Ví dụ

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 players 4 non-null object
1 titles 4 non-null int64
dtypes: int64(1), object(1)
memory usage: 192.0+ bytes
None

1. Bây giờ chúng ta hãy thêm người chơi mới "Dominic Theim" vào khung dữ liệu bằng cách sử dụng thuộc tính .loc.

new_Player = ['Dominic Theim', 1]
players_info.loc[4] = new_Player

đầu ra

print(players_info)


players titles
0 Roger Federer 20
1 Rafael Nadal 20
2 Novak Djokovic 17
3 Andy Murray 3
4 Dominic Theim 1

1. Sử dụng cùng một thuộc tính .loc, chúng ta hãy thêm hàng mới vào cuối dataframe. Sau đây, tôi sẽ hướng dẫn cách thêm từ điển vào khung dữ liệu.

new_player = {'players': 'Daniel Medvedev', 'titles': 0}
players_info.loc[len(players_info)] = new_player

Đầu ra

print(players_info)


players titles
0 Roger Federer 20
1 Rafael Nadal 20
2 Novak Djokovic 17
3 Andy Murray 3
4 Dominic Theim 1
5 Daniel Medvedev 0

1. Chúng tôi cũng có thể thêm dữ liệu lưu giữ chuỗi gấu trúc vào khung dữ liệu.

players_info.loc[len(players_info)] = pd.Series({'players': 'Andy Zverev', 'titles': 0})

Đầu ra

print(players_info)
players titles
0 Roger Federer 20
1 Rafael Nadal 20
2 Novak Djokovic 17
3 Andy Murray 3
4 Dominic Theim 1
5 Daniel Medvedev 0
6 Andy Zverev 0

Kết luận

Chúng tôi đã thêm dữ liệu trong 4 bước trên bằng phương thức .loc. Thuộc tính .loc thực hiện các thay đổi đối với DataFrame tại chỗ.

Trong vài bước tiếp theo, chúng ta sẽ xem xét phương thức .append, phương thức này không sửa đổi DataFrame đang gọi, ratherit trả về một bản sao mới của DataFrame với / s hàng được thêm vào.

Đối số đầu tiên cho .append phải là DataFrame, Series, từ điển hoặc danh sách khác.

Ví dụ

# Create a DataFrame with index
players_info = pd.DataFrame(data=[
{"players": "Roger Federer", "titles": 20},
{"players": "Rafael Nadal", "titles": 20},
{"players": "Novak Djokovic", "titles": 17},
{"players": "Andy Murray", "titles": 3}], columns=["players", "titles"],
index=["roger", "nadal", "djokovic", "murray"])


# Add a new row(dictionary) to DataFrame using .append method.
players_info.append({'players': 'Daniel Medvedev', 'titles': 0})


---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 # Add a new row(dictionary) to DataFrame using .append method.
----> 2 players_info.append({'players': 'Daniel Medvedev', 'titles': 0})

~\anaconda3\lib\site-packages\pandas\core\frame.py in append(self, other, ignore_index, verify_integrity, sort)
7046 other = Series(other)
7047 if other.name is None and not ignore_index:
-> 7048 raise TypeError(
7049 "Can only append a Series if ignore_index=True "
7050 "or if the Series has a name"

TypeError Chỉ có thể nối thêm một Chuỗi nếu ignore_index =True hoặc nếu Sê-ri có tên

Khi tôi cố gắng nối thêm một từ điển, nó đã đưa ra một ngoại lệ yêu cầu chúng tôi sử dụng tham số ignore_index =True. Vì vậy, hãy để tôi thêm tham số được đề xuất này và xem nó hoạt động như thế nào.

new_df = players_info.append({'players': 'Daniel Medvedev', 'titles': 0}, ignore_index=True)

Đầu ra

print(f" *** Original with index \n {players_info} \n\n\n *** Modified index \n {new_df}")


*** Original with index
players titles
roger Roger Federer 20
nadal Rafael Nadal 20
djokovic Novak Djokovic 17
murray Andy Murray 3

*** Modified index
players titles
0 Roger Federer 20
1 Rafael Nadal 20
2 Novak Djokovic 17
3 Andy Murray 3
4 Daniel Medvedev 0

Bạn đã quan sát thấy gì từ đầu ra sau khi tôi sử dụng tham số ignore_index =True? Có, Khi ignore_index được đặt thành True, chỉ mục cũ sẽ bị xóa hoàn toàn và được thay thế bằng RangeIndex từ 0 đến n-1.

Phương thức .append khá hữu ích khi bạn muốn thêm nhiều hàng vào DataFrame trong một lần.

player1 = pd.Series({'players': 'Andy Zverev', 'titles': 0}, name='zverev')
player2 = pd.Series({'players': 'Dominic Theim', 'titles': 1}, name='theim')
new_df_1 = players_info.append([player1, player2])

Đầu ra

print(new_df_1)
players titles
roger Roger Federer 20
nadal Rafael Nadal 20
djokovic Novak Djokovic 17
murray Andy Murray 3
zverev Andy Zverev 0
theim Dominic Theim 1

Được rồi, bây giờ bạn đã thấy những kiến ​​thức cơ bản về cách thêm hàng, chúng ta sẽ đi sâu vào cách thêm hàng trên khung dữ liệu có nhiều cột.

df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")

Đầu ra

print(df.info())

Ví dụ

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4803 entries, 0 to 4802
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 budget 4803 non-null int64
1 id 4803 non-null int64
2 original_language 4803 non-null object
3 original_title 4803 non-null object
4 popularity 4803 non-null float64
5 release_date 4802 non-null object
6 revenue 4803 non-null int64
7 runtime 4801 non-null float64
8 status 4803 non-null object
9 title 4803 non-null object
10 vote_average 4803 non-null float64
11 vote_count 4803 non-null int64
dtypes: float64(3), int64(4), object(5)
memory usage: 450.4+ KB
None

Tập dữ liệu này của Google có 12 cột và rất dễ nhập sai tên cột hoặc quên hoàn toàn một cột nếu bạn nhập các hàng dữ liệu mới theo cách thủ công. Vì vậy, làm thế nào chúng ta có thể tránh vấn đề này? Có một cách, chỉ cần tạo một mẫu tên các cột.

columns_dictionary = df.iloc[0].to_dict()
##### Output:


print(columns_dictionary)


{'budget': 237000000, 'id': 19995, 'original_language': 'en', 'original_title': 'Avatar', 'popularity': 150.437577, 'release_date': '10/12/2009', 'revenue': 2787965087, 'runtime': 162.0, 'status': 'Released', 'title': 'Avatar', 'vote_average': 7.2, 'vote_count': 11800}

Vì vậy, bây giờ bạn có thể hiểu rằng chúng tôi đã lấy hàng đầu tiên và chuyển đổi nó thành từ điển. và tất cả các giá trị khác dưới dạng giá trị bị thiếu.

Từ điển này hiện có thể dùng làm mẫu cho bất kỳ dữ liệu mới nào bạn muốn nhập.

Ví dụ

import datetime

new_data_dict = {}
for a, b in columns_dictionary.items():
if isinstance(b, str):
new_data_dict[a] = np.random.choice(list('abcde'))
elif isinstance(b, datetime.date):
new_data_dict[a] = np.nan
else:
new_data_dict[a] = np.nan

Đầu ra

print(new_data_dict)


{'budget': nan, 'id': nan, 'original_language': 'e', 'original_title': 'a', 'popularity': nan, 'release_date': 'b', 'revenue': nan, 'runtime': nan, 'status': 'e', 'title': 'c', 'vote_average': nan, 'vote_count': nan}