比较列中的字符串并在python中创建相应的新列

时间:2017-03-19 05:33:47

标签: python python-3.x pandas dataframe jupyter-notebook

我的数据框如下所示。我需要将数据框中的列与字符串进行比较并创建新列。

数据帧:

14      {% load socialaccount %}
15      {% providers_media_js %}
16      <a href="{% provider_login_url "facebook" method="js_sdk" %}">Facebook Connect</a>
17  
18      {% if user.is_authenticated %}
19      
20      <a href="/accounts/logout">
21          <button class="btn btn-default">Logout</button>
22      </a>
23      {% else %}
24      <a href="/accounts/login">
25          <button class="btn btn-default">Login</button>

如果&#39; AB&#39;,&#39; AK&#39;&#39; SB&#39;在col_1中,它应该创建一个新的列,其中包含各自的值,否则&#39; *&#39;应该列在列值中。

预期产出:

col_1
AB_SUMI
AK_SUMI
SB_LIMA
SB_SUMI
XY_SUMI

我尝试使用以下代码,但没有解决。

col_1      new_col
AB_SUMI     AB
AK_SUMI     AK
SB_LIMA     SB
SB_SUMI     SB
XY_SUMI     *

请在这方面帮助我。提前致谢

2 个答案:

答案 0 :(得分:2)

您可以extract使用regex创建list join | orNaN),最后替换L= ['AB','AK','SB'] a = '(' + '|'.join(L) + ')' print (a) (AB|AK|SB) df['new'] = df.col_1.str.extract(a, expand=False).fillna('*') print (df) col_1 new 0 AB_SUMI AB 1 AK_SUMI AK 2 SB_LIMA SB 3 SB_SUMI SB 4 XY_SUMI * fillna

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.quickstart.fcm">
    <uses-permission android:name="android.permission.READ_CALENDAR" />
    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/app_logo"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <!-- [START fcm_default_icon] -->

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_stat_ic_notification" />

        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
        <!-- [END fcm_default_icon] -->
        <activity
            android:name="com.google.firebase.quickstart.fcm.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name="com.google.firebase.quickstart.fcm.CalendarActivity"
            android:label="@string/calendar_activity_label">
        </activity>

        <!-- [START firebase_service] -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_service] -->
        <!-- [START firebase_iid_service] -->
        <service
            android:name=".MyFirebaseInstanceIDService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
            </intent-filter>
        </service>
        <!-- [END firebase_iid_service] -->
    </application>

</manifest>

答案 1 :(得分:0)

一种有趣的方法

L = 'AB AK SB'.split()

c = df.col_1.values.astype(str)
f = lambda x, s : np.core.defchararray.find(x, s) >= 0
df.assign(new=np.stack([f(c, i) for i in L]).astype(object).T.dot(np.reshape(L, (-1, 1)))).replace('', '*')

     col_1 new
0  AB_SUMI  AB
1  AK_SUMI  AK
2  SB_LIMA  SB
3  SB_SUMI  SB
4  XY_SUMI   *