2016-12-13 16 views
5

Để thêm một tiền tố/hậu tố vào một dataframe, tôi thường làm như sau ..gấu trúc dataframe: thêm & loại bỏ tiền tố/hậu tố từ tất cả các giá trị tế bào của toàn bộ dataframe

Ví dụ, để thêm một hậu tố '@',

df = df.astype(str) + '@' 

Điều này về cơ bản đã thêm '@' vào tất cả các giá trị ô.

Tôi muốn biết cách xóa hậu tố này. Có phương pháp nào có sẵn với lớp pandas.DataFrame trực tiếp để loại bỏ một tiền tố/hậu tố cụ thể từ toàn bộ DataFrame không?

tôi đã cố gắng lặp lại qua các hàng (như series) trong khi sử dụng rstrip('@') như sau:

for index in range(df.shape[0]): 
    row = df.iloc[index] 
    row = row.str.rstrip('@') 

Bây giờ, để làm cho dataframe ra của loạt bài này,

new_df = pd.DataFrame(columns=list(df)) 
new_df = new_df.append(row) 

Tuy nhiên, điều này không hiệu quả. Cung cấp dataframe trống.

Có điều gì đó thực sự cơ bản mà tôi đang thiếu không?

Trả lời

3

Bạn có thể sử dụng applymap để áp dụng phương pháp chuỗi của bạn để mỗi phần tử:

df = df.applymap(lambda x: str(x).rstrip('@')) 
+0

hoàn hảo! Cảm ơn Alex :) – murphy1310

5

Bạn có thể sử dụng apply và phương pháp str.strip của pd.Series:

In [13]: df 
Out[13]: 
     a  b  c 
0 dog quick the 
1 lazy lazy fox 
2 brown quick dog 
3 quick  the over 
4 brown over lazy 
5 fox brown quick 
6 quick  fox the 
7 dog jumped the 
8 lazy brown the 
9 dog lazy the 

In [14]: df = df + "@" 

In [15]: df 
Out[15]: 
     a  b  c 
0 [email protected] [email protected] [email protected] 
1 [email protected] [email protected] [email protected] 
2 [email protected] [email protected] [email protected] 
3 [email protected]  [email protected] [email protected] 
4 [email protected] [email protected] [email protected] 
5 [email protected] [email protected] [email protected] 
6 [email protected]  [email protected] [email protected] 
7 [email protected] [email protected] [email protected] 
8 [email protected] [email protected] [email protected] 
9 [email protected] [email protected] [email protected] 

In [16]: df = df.apply(lambda S:S.str.strip('@')) 

In [17]: df 
Out[17]: 
     a  b  c 
0 dog quick the 
1 lazy lazy fox 
2 brown quick dog 
3 quick  the over 
4 brown over lazy 
5 fox brown quick 
6 quick  fox the 
7 dog jumped the 
8 lazy brown the 
9 dog lazy the 

Lưu ý, cách tiếp cận của bạn không hoạt động vì khi bạn làm nhiệm vụ sau đây trong cho vòng lặp:

row = row.str.rstrip('@') 

Điều này chỉ gán kết quả của row.str.strip vào tên row mà không làm biến đổi DataFrame. Đây là hành vi tương tự cho tất cả các đối tượng python và phân công tên đơn giản:

In [18]: rows = [[1,2,3],[4,5,6],[7,8,9]] 

In [19]: print(rows) 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [20]: for row in rows: 
    ...:  row = ['look','at','me'] 
    ...: 

In [21]: print(rows) 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

Để thực sự thay đổi cấu trúc dữ liệu cơ bản bạn cần phải sử dụng một phương pháp mutator:

In [22]: rows 
Out[22]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [23]: for row in rows: 
    ...:  row.append("LOOKATME") 
    ...: 

In [24]: rows 
Out[24]: [[1, 2, 3, 'LOOKATME'], [4, 5, 6, 'LOOKATME'], [7, 8, 9, 'LOOKATME']] 

Lưu ý rằng lát-phân công chỉ là cú pháp đường cho một phương pháp mutator:

In [26]: rows 
Out[26]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

In [27]: for row in rows: 
    ...:  row[:] = ['look','at','me'] 
    ...: 
    ...: 

In [28]: rows 
Out[28]: [['look', 'at', 'me'], ['look', 'at', 'me'], ['look', 'at', 'me']] 

Điều này giống như pandasloc hoặc iloc assi dựa gnment.

+0

Cảm ơn Juanpa. df.apply (...) giúp Tuy nhiên, kết quả của tôi là qua new_df chứ không phải df. Tôi cần phải chính xác hơn với điều đó. Thanks anyway :) – murphy1310

+0

Huh? Điều này không giải quyết được vấn đề của bạn. Tôi jus gọi là khung dữ liệu của tôi df. Bạn có thể thêm kết quả vào new_df nếu bạn muốn –

+0

oh no. Tôi không có ý đó :) df.apply() không giải quyết được vấn đề .. Cảm ơn! Tôi có nghĩa là vấn đề của tôi không phải là làm thay đổi dữ liệu cơ bản. Có lẽ tôi không quá rõ ràng. – murphy1310

Các vấn đề liên quan